diff options
Diffstat (limited to 'lib')
54 files changed, 1 insertions, 5773 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index e7670d88..97b7b2b3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1 +1 @@ -SUBDIRS = utils plugins +SUBDIRS = utils diff --git a/lib/plugins/Bugzilla.conf b/lib/plugins/Bugzilla.conf deleted file mode 100644 index 76e0d1d8..00000000 --- a/lib/plugins/Bugzilla.conf +++ /dev/null @@ -1,12 +0,0 @@ -# Description: Reports bugs to bugzilla - -Enabled = yes - -# Bugzilla URL -BugzillaURL = https://bugzilla.redhat.com/ -# yes means that ssl certificates will be checked -SSLVerify = yes -# your login has to exist, if you don have any, please create one -Login = -# your password -Password = diff --git a/lib/plugins/Bugzilla.cpp b/lib/plugins/Bugzilla.cpp deleted file mode 100644 index 452d7a58..00000000 --- a/lib/plugins/Bugzilla.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "abrtlib.h" -#include "crash_types.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" -#include "Bugzilla.h" - -using namespace std; - -CReporterBugzilla::CReporterBugzilla() -{ - m_pSettings["BugzillaURL"] = "https://bugzilla.redhat.com"; - m_pSettings["Login"] = ""; - m_pSettings["Password"] = ""; - m_pSettings["SSLVerify"] = "yes"; - m_pSettings["RatingRequired"] = "yes"; -} - -CReporterBugzilla::~CReporterBugzilla() -{ -} - -void CReporterBugzilla::SetSettings(const map_plugin_settings_t& pSettings) -{ -//BUG! This gets called when user's keyring contains login data, -//then it takes precedence over /etc/abrt/plugins/Bugzilla.conf. -//I got a case when keyring had a STALE password, and there was no way -//for me to know that it is being used. Moreover, when I discovered it -//(by hacking abrt source!), I don't know how to purge it from the keyring. -//At the very least, log("SOMETHING") here. - - /* Can't simply do this: - - m_pSettings = pSettings; - - * - it will erase keys which aren't present in pSettings. - * Example: if Bugzilla.conf doesn't have "Login = foo", - * then there's no pSettings["Login"] and m_pSettings = pSettings - * will nuke default m_pSettings["Login"] = "", - * making GUI think that we have no "Login" key at all - * and thus never overriding it - even if it *has* an override! - */ - - map_plugin_settings_t::iterator it = m_pSettings.begin(); - while (it != m_pSettings.end()) - { - map_plugin_settings_t::const_iterator override = pSettings.find(it->first); - if (override != pSettings.end()) - { - VERB3 log(" 3 settings[%s]='%s'", it->first.c_str(), it->second.c_str()); - it->second = override->second; - } - it++; - } -} - -string CReporterBugzilla::Report(const map_crash_data_t& crash_data, - const map_plugin_settings_t& settings, - const char *args) -{ - /* abrt-action-bugzilla [-s] -c /etc/arbt/Bugzilla.conf -c - -d pCrashData.dir NULL */ - char *argv[9]; - char **pp = argv; - *pp++ = (char*)"abrt-action-bugzilla"; - -//We want to consume output, so don't redirect to syslog. -// if (logmode & LOGMODE_SYSLOG) -// *pp++ = (char*)"-s"; -//TODO: the actions<->daemon interaction will be changed anyway... - - *pp++ = (char*)"-c"; - *pp++ = (char*)(PLUGINS_CONF_DIR"/Bugzilla."PLUGINS_CONF_EXTENSION); - *pp++ = (char*)"-c"; - *pp++ = (char*)"-"; - *pp++ = (char*)"-d"; - *pp++ = (char*)get_crash_data_item_content_or_NULL(crash_data, CD_DUMPDIR); - *pp = NULL; - int pipefds[2]; - pid_t pid = fork_execv_on_steroids(EXECFLG_INPUT + EXECFLG_OUTPUT + EXECFLG_ERR2OUT, - argv, - pipefds, - /* unsetenv_vec: */ NULL, - /* dir: */ NULL, - /* uid(unused): */ 0 - ); - - /* Write the configuration to stdin */ - map_plugin_settings_t::const_iterator it = settings.begin(); - while (it != settings.end()) - { - full_write_str(pipefds[1], it->first.c_str()); - full_write_str(pipefds[1], "="); - full_write_str(pipefds[1], it->second.c_str()); - full_write_str(pipefds[1], "\n"); - it++; - } - close(pipefds[1]); - - FILE *fp = fdopen(pipefds[0], "r"); - if (!fp) - die_out_of_memory(); - - /* Consume log from stdout */ - string bug_status; - char *buf; - while ((buf = xmalloc_fgetline(fp)) != NULL) - { - if (strncmp(buf, "STATUS:", 7) == 0) - bug_status = buf + 7; - else - if (strncmp(buf, "EXCEPT:", 7) == 0) - { - CABRTException e(EXCEP_PLUGIN, "%s", buf + 7); - free(buf); - fclose(fp); - waitpid(pid, NULL, 0); - throw e; - } - update_client("%s", buf); - free(buf); - } - - fclose(fp); /* this also closes pipefds[0] */ - /* wait for child to actually exit, and prevent leaving a zombie behind */ - waitpid(pid, NULL, 0); - - return bug_status; -} - -PLUGIN_INFO(REPORTER, - CReporterBugzilla, - "Bugzilla", - "0.0.4", - _("Reports bugs to bugzilla"), - "npajkovs@redhat.com", - "https://fedorahosted.org/abrt/wiki", - PLUGINS_LIB_DIR"/Bugzilla.glade"); diff --git a/lib/plugins/Bugzilla.glade b/lib/plugins/Bugzilla.glade deleted file mode 100644 index cabdd06a..00000000 --- a/lib/plugins/Bugzilla.glade +++ /dev/null @@ -1,246 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">12</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="lBugzillaURL"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Bugzilla URL:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lLogin"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Login(email):</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lPassword"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Password:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_BugzillaURL"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Login"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Password"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="visibility">False</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="cb_Password"> - <property name="label" translatable="yes">Show password</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label3"> - <property name="xalign">0</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_SSLVerify"> - <property name="label" translatable="yes">SSL verify</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Bugzilla plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="label" translatable="yes">Don't have an account yet?</property> - <property name="use_markup">True</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="xpad">5</property> - <property name="label" translatable="yes">You can create it <a href="https://bugzilla.redhat.com/createaccount.cgi">here</a></property> - <property name="use_markup">True</property> - <property name="selectable">True</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="bApply"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">bApply</action-widget> - </action-widgets> - </object> - <object class="GtkAction" id="action1"/> -</interface> diff --git a/lib/plugins/Bugzilla.h b/lib/plugins/Bugzilla.h deleted file mode 100644 index d7f3acf0..00000000 --- a/lib/plugins/Bugzilla.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef BUGZILLA_H_ -#define BUGZILLA_H_ - -#include "plugin.h" -#include "reporter.h" - -class CReporterBugzilla : public CReporter -{ - public: - CReporterBugzilla(); - virtual ~CReporterBugzilla(); - - virtual std::string Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs); - virtual void SetSettings(const map_plugin_settings_t& pSettings); -}; - -#endif /* BUGZILLA_H_ */ diff --git a/lib/plugins/CCpp.conf b/lib/plugins/CCpp.conf deleted file mode 100644 index 4af91470..00000000 --- a/lib/plugins/CCpp.conf +++ /dev/null @@ -1,44 +0,0 @@ -# Configuration file for CCpp hook and plugin -Enabled = yes - -# If you also want to dump file named "core" -# in crashed process' current dir, set to "yes" -MakeCompatCore = yes - -# Do you want a copy of crashed binary be saved? -# (useful, for example, when _deleted binary_ segfaults) -SaveBinaryImage = no - -# Generate backtrace -Backtrace = yes -# How long to wait for gdb to finish. Default is 60 seconds. -GdbTimeoutSec = 120 - -# Generate backtrace for crashes uploaded from remote machines. -# Note that for reliable backtrace generation, your local machine -# needs to have the crashed executable and all libraries it uses, -# and they need to be the same versions as on remote machines. -# If you cannot ensure that, it's better to set this option to "no" -BacktraceRemotes = no - -# Generate memory map too (IGNORED FOR NOW) -MemoryMap = no - -# How to get debuginfo: install, mount -## install - download and install debuginfo packages -## mount - mount fedora NFS with debug info -## (IGNORED FOR NOW) -DebugInfo = install - -# If this option is set to "yes", -# debuginfos will be installed to @@LOCALSTATEDIR@@/cache/abrt-di -InstallDebugInfo = yes - -# Additional directories to search for debuginfos. -# For example, you can list a network-mounted shared store -# of all debuginfos here. -# ReadonlyLocalDebugInfoDirs = /path1:/path2:... - -# Keep @@LOCALSTATEDIR@@/cache/abrt-di -# from growing out-of-bounds. -DebugInfoCacheMB = 4000 diff --git a/lib/plugins/CCpp.cpp b/lib/plugins/CCpp.cpp deleted file mode 100644 index fad9cf62..00000000 --- a/lib/plugins/CCpp.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* - CCpp.cpp - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include <set> -#include "abrtlib.h" -#include "CCpp.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" -#include "Polkit.h" - -using namespace std; - -#define CORE_PATTERN_IFACE "/proc/sys/kernel/core_pattern" -#define CORE_PATTERN "|"CCPP_HOOK_PATH" "DEBUG_DUMPS_DIR" %p %s %u %c" -#define CORE_PIPE_LIMIT_IFACE "/proc/sys/kernel/core_pipe_limit" -/* core_pipe_limit specifies how many dump_helpers might run at the same time -0 - means unlimited, but the it's not guaranteed that /proc/<pid> of crashing -process might not be available for dump_helper -4 - means that 4 dump_helpers can run at the same time, which should be enough -for ABRT, we can miss some crashes, but what are the odds that more processes -crash at the same time? This value has been recommended by nhorman -*/ -#define CORE_PIPE_LIMIT "4" - -#define DEBUGINFO_CACHE_DIR LOCALSTATEDIR"/cache/abrt-di" - -CAnalyzerCCpp::CAnalyzerCCpp() : - m_bBacktrace(true), - m_bBacktraceRemotes(false), - m_bMemoryMap(false), - m_bInstallDebugInfo(true), - m_nDebugInfoCacheMB(4000), - m_nGdbTimeoutSec(60) -{} - -/* - this is just a workaround until kernel changes it's behavior - when handling pipes in core_pattern -*/ -#ifdef HOSTILE_KERNEL -#define CORE_SIZE_PATTERN "Max core file size=1:unlimited" -static int isdigit_str(char *str) -{ - do { - if (*str < '0' || *str > '9') - return 0; - } while (*++str); - return 1; -} - -static int set_limits() -{ - DIR *dir = opendir("/proc"); - if (!dir) { - /* this shouldn't fail, but to be safe.. */ - return 1; - } - - struct dirent *ent; - while ((ent = readdir(dir)) != NULL) { - if (!isdigit_str(ent->d_name)) - continue; - - char limits_name[sizeof("/proc/%s/limits") + sizeof(long)*3]; - snprintf(limits_name, sizeof(limits_name), "/proc/%s/limits", ent->d_name); - FILE *limits_fp = fopen(limits_name, "r"); - if (!limits_fp) { - break; - } - - char line[128]; - char *ulimit_c = NULL; - while (1) { - if (fgets(line, sizeof(line)-1, limits_fp) == NULL) - break; - if (strncmp(line, "Max core file size", sizeof("Max core file size")-1) == 0) { - ulimit_c = skip_whitespace(line + sizeof("Max core file size")-1); - skip_non_whitespace(ulimit_c)[0] = '\0'; - break; - } - } - fclose(limits_fp); - if (!ulimit_c || ulimit_c[0] != '0' || ulimit_c[1] != '\0') { - /*process has nonzero ulimit -c, so need to modify it*/ - continue; - } - /* echo -n 'Max core file size=1:unlimited' >/proc/PID/limits */ - int fd = open(limits_name, O_WRONLY); - if (fd >= 0) { - errno = 0; - /*full_*/ - ssize_t n = write(fd, CORE_SIZE_PATTERN, sizeof(CORE_SIZE_PATTERN)-1); - if (n < sizeof(CORE_SIZE_PATTERN)-1) - log("warning: can't write core_size limit to: %s", limits_name); - close(fd); - } - else - { - log("warning: can't open %s for writing", limits_name); - } - } - closedir(dir); - return 0; -} -#endif /* HOSTILE_KERNEL */ - -void CAnalyzerCCpp::Init() -{ - FILE *fp = fopen(CORE_PATTERN_IFACE, "r"); - if (fp) - { - char line[PATH_MAX]; - if (fgets(line, sizeof(line), fp)) - m_sOldCorePattern = line; - fclose(fp); - } - if (m_sOldCorePattern[0] == '|') - { - if (m_sOldCorePattern == CORE_PATTERN) - { - log("warning: %s already contains %s, " - "did abrt daemon crash recently?", - CORE_PATTERN_IFACE, CORE_PATTERN); - /* There is no point in "restoring" CORE_PATTERN_IFACE - * to CORE_PATTERN on exit. Will restore to a default value: - */ - m_sOldCorePattern = "core"; - } else { - log("warning: %s was already set to run a crash analyser (%s), " - "abrt may interfere with it", - CORE_PATTERN_IFACE, CORE_PATTERN); - } - } -#ifdef HOSTILE_KERNEL - if (set_limits() != 0) - log("warning: failed to set core_size limit, ABRT won't detect crashes in" - "compiled apps"); -#endif - - fp = fopen(CORE_PATTERN_IFACE, "w"); - if (fp) - { - fputs(CORE_PATTERN, fp); - fclose(fp); - } - - /* read the core_pipe_limit and change it if it's == 0 - otherwise the abrt-hook-ccpp won't be able to read /proc/<pid> - of the crashing process - */ - fp = fopen(CORE_PIPE_LIMIT_IFACE, "r"); - if (fp) - { - /* we care only about the first char, if it's - * not '0' then we don't have to change it, - * because it means that it's already != 0 - */ - char pipe_limit[2]; - if (!fgets(pipe_limit, sizeof(pipe_limit), fp)) - pipe_limit[0] = '1'; /* not 0 */ - fclose(fp); - if (pipe_limit[0] == '0') - { - fp = fopen(CORE_PIPE_LIMIT_IFACE, "w"); - if (fp) - { - fputs(CORE_PIPE_LIMIT, fp); - fclose(fp); - } - else - { - log("warning: failed to set core_pipe_limit, ABRT won't detect" - "crashes in compiled apps if kernel > 2.6.31"); - } - } - } -} - -void CAnalyzerCCpp::DeInit() -{ - /* no need to restore the core_pipe_limit, because it's only used - when there is s pipe in core_pattern - */ - FILE *fp = fopen(CORE_PATTERN_IFACE, "w"); - if (fp) - { - fputs(m_sOldCorePattern.c_str(), fp); - fclose(fp); - } -} - -void CAnalyzerCCpp::SetSettings(const map_plugin_settings_t& pSettings) -{ - m_pSettings = pSettings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - it = pSettings.find("Backtrace"); - if (it != end) - { - m_bBacktrace = string_to_bool(it->second.c_str()); - } - it = pSettings.find("BacktraceRemotes"); - if (it != end) - { - m_bBacktraceRemotes = string_to_bool(it->second.c_str()); - } - it = pSettings.find("MemoryMap"); - if (it != end) - { - m_bMemoryMap = string_to_bool(it->second.c_str()); - } - it = pSettings.find("DebugInfo"); - if (it != end) - { - m_sDebugInfo = it->second; - } - it = pSettings.find("DebugInfoCacheMB"); - if (it != end) - { - m_nDebugInfoCacheMB = xatou(it->second.c_str()); - } - it = pSettings.find("GdbTimeoutSec"); - if (it != end) - { - m_nGdbTimeoutSec = xatoi_u(it->second.c_str()); - } - it = pSettings.find("InstallDebugInfo"); - if (it == end) //compat, remove after 0.0.11 - it = pSettings.find("InstallDebuginfo"); - if (it != end) - { - m_bInstallDebugInfo = string_to_bool(it->second.c_str()); - } - m_sDebugInfoDirs = DEBUGINFO_CACHE_DIR; - it = pSettings.find("ReadonlyLocalDebugInfoDirs"); - if (it != end) - { - m_sDebugInfoDirs += ':'; - m_sDebugInfoDirs += it->second; - } -} - -//ok to delete? -//const map_plugin_settings_t& CAnalyzerCCpp::GetSettings() -//{ -// m_pSettings["MemoryMap"] = m_bMemoryMap ? "yes" : "no"; -// m_pSettings["DebugInfo"] = m_sDebugInfo; -// m_pSettings["DebugInfoCacheMB"] = to_string(m_nDebugInfoCacheMB); -// m_pSettings["InstallDebugInfo"] = m_bInstallDebugInfo ? "yes" : "no"; -// -// return m_pSettings; -//} - -PLUGIN_INFO(ANALYZER, - CAnalyzerCCpp, - "CCpp", - "0.0.1", - _("Analyzes crashes in C/C++ programs"), - "zprikryl@redhat.com", - "https://fedorahosted.org/abrt/wiki", - ""); diff --git a/lib/plugins/CCpp.h b/lib/plugins/CCpp.h deleted file mode 100644 index e95b4d09..00000000 --- a/lib/plugins/CCpp.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - CCpp.h - header file for C/C++ analyzer plugin - - it can get UUID and memory maps from core files - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef CCPP_H_ -#define CCPP_H_ - -#include <string> -#include "plugin.h" -#include "analyzer.h" - -class CAnalyzerCCpp : public CAnalyzer -{ - private: - bool m_bBacktrace; - bool m_bBacktraceRemotes; - bool m_bMemoryMap; - bool m_bInstallDebugInfo; - unsigned m_nDebugInfoCacheMB; - unsigned m_nGdbTimeoutSec; - std::string m_sOldCorePattern; - std::string m_sDebugInfo; - std::string m_sDebugInfoDirs; - - public: - CAnalyzerCCpp(); - virtual void Init(); - virtual void DeInit(); - virtual void SetSettings(const map_plugin_settings_t& pSettings); -}; - -#endif /* CCPP */ diff --git a/lib/plugins/FileTransfer.conf b/lib/plugins/FileTransfer.conf deleted file mode 100644 index 111c1c4b..00000000 --- a/lib/plugins/FileTransfer.conf +++ /dev/null @@ -1,35 +0,0 @@ -# Configuration of the FileTransfer reporter plugin. -Enabled = yes - -# The plugin is invoked in the abrt.conf file, usually in the -# ActionsAndReporters option and/or the [cron] section. -# There are two modes of invocation: -# -# * Specify FileTransfer(one) in ActionsAndReporters directive. -# Immediately after crash is detected, the plugin transfers -# crash data to the server specified via URL directive in this file. -# -# * Specify FileTransfer(store) in ActionsAndReporters directive -# and add "HH:MM = FileTransfer" line in [cron] section. -# At the time of the crash, the plugin stores a record of it -# in its internal list. When specified time is reached, -# the plugin iterates through its internal list and sends -# every recorded crash to the specified URL. -# After that, the internal list is cleared. - - -# URL to upload the files to -# supported: ftp, ftps, http, https, scp, sftp, tftp, file -# for example: ftp://user:password@server.name/directory -# or: scp://user:password@server.name:port/directory etc. -# for testing: file:///tmp/test_directory -URL = - -# Archive type, one of .zip, .tar.gz or .tar.bz2 -ArchiveType = .tar.gz - -# How many times we try to upload the file -RetryCount = 3 - -# How long we wait between we retry the upload (in seconds) -RetryDelay = 20 diff --git a/lib/plugins/FileTransfer.cpp b/lib/plugins/FileTransfer.cpp deleted file mode 100644 index d964bc9d..00000000 --- a/lib/plugins/FileTransfer.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/* - FileTransfer.cpp - - Copyright (C) 2009 Daniel Novotny (dnovotny@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef _GNU_SOURCE -# define _GNU_SOURCE -#endif -#include <libtar.h> -#include <bzlib.h> -#include <zlib.h> -#include "abrtlib.h" -#include "abrt_curl.h" -#include "FileTransfer.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" - -using namespace std; - -#define HBLEN 255 -#define FILETRANSFER_DIRLIST DEBUG_DUMPS_DIR "/FileTransferDirlist.txt" - -CFileTransfer::CFileTransfer() -: - m_sArchiveType(".tar.gz"), - m_nRetryCount(3), - m_nRetryDelay(20) -{ -} - -void CFileTransfer::SendFile(const char *pURL, const char *pFilename) -{ - int len = strlen(pURL); - if (len == 0) - { - error_msg(_("FileTransfer: URL not specified")); - return; - } - - update_client(_("Sending archive %s to %s"), pFilename, pURL); - - char *whole_url = concat_path_file(pURL, strrchr(pFilename, '/') ? : pFilename); - - int count = m_nRetryCount; - while (1) - { - FILE *f = fopen(pFilename, "r"); - if (!f) - { - free(whole_url); - throw CABRTException(EXCEP_PLUGIN, "Can't open archive file '%s'", pFilename); - } - - struct stat buf; - fstat(fileno(f), &buf); /* never fails */ - - CURL *curl = xcurl_easy_init(); - /* enable uploading */ - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); - /* specify target */ - curl_easy_setopt(curl, CURLOPT_URL, whole_url); - /* FILE handle: passed to the default callback, it will fread() it */ - curl_easy_setopt(curl, CURLOPT_READDATA, f); - curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)buf.st_size); - - /* everything is done here; result 0 means success */ - int result = curl_easy_perform(curl); - - curl_easy_cleanup(curl); - fclose(f); - if (result == 0 || --count <= 0) - break; - /* retry the upload if not succesful, wait a bit before next try */ - sleep(m_nRetryDelay); - } - free(whole_url); -} - -static void create_tar(const char *archive_name, const char *directory) -{ - TAR *tar; - - if (tar_open(&tar, (char *)archive_name, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU) != 0) - { - return; - } - tar_append_tree(tar, (char *)directory, (char*)"."); - tar_close(tar); -} - -static void create_targz(const char *archive_name, const char *directory) -{ - char *name_without_gz = xstrdup(archive_name); - strrchr(name_without_gz, '.')[0] = '\0'; - - create_tar(name_without_gz, directory); - - int fd = open(name_without_gz, O_RDONLY); - if (fd < 0) - { - remove(name_without_gz); - free(name_without_gz); - return; - } - - gzFile gz = gzopen(archive_name, "w"); - if (gz == NULL) - { - close(fd); - remove(name_without_gz); - free(name_without_gz); - return; - } - - char buf[BUFSIZ]; - ssize_t bytesRead; - while ((bytesRead = full_read(fd, buf, BUFSIZ)) > 0) - { - gzwrite(gz, buf, bytesRead); // TODO: check that return value == bytesRead - } - - gzclose(gz); - close(fd); - remove(name_without_gz); - free(name_without_gz); -} - -static void create_tarbz2(const char * archive_name, const char * directory) -{ - char *name_without_bz2 = xstrdup(archive_name); - strrchr(name_without_bz2, '.')[0] = '\0'; - - create_tar(name_without_bz2, directory); - - int tarFD = open(name_without_bz2, O_RDONLY); - if (tarFD == -1) - { - remove(name_without_bz2); - free(name_without_bz2); - return; - } - FILE *f = fopen(archive_name, "w"); - if (f == NULL) - { - close(tarFD); - remove(name_without_bz2); - free(name_without_bz2); - return; - } - int bzError; - BZFILE *bz = BZ2_bzWriteOpen(&bzError, f, /*BLOCK_MULTIPLIER:*/ 7, 0, 0); - if (bz == NULL) - { - fclose(f); - close(tarFD); - remove(name_without_bz2); - free(name_without_bz2); - return; - } - - char buf[BUFSIZ]; - ssize_t bytesRead; - while ((bytesRead = read(tarFD, buf, BUFSIZ)) > 0) - { - BZ2_bzWrite(&bzError, bz, buf, bytesRead); - } - - BZ2_bzWriteClose(&bzError, bz, 0, NULL, NULL); - fclose(f); - close(tarFD); - remove(name_without_bz2); - free(name_without_bz2); -} - -void CFileTransfer::CreateArchive(const char *pArchiveName, const char *pDir) -{ - if (m_sArchiveType == ".tar") - { - create_tar(pArchiveName, pDir); - } - else if (m_sArchiveType == ".tar.gz") - { - create_targz(pArchiveName, pDir); - } - else if (m_sArchiveType == ".tar.bz2") - { - create_tarbz2(pArchiveName, pDir); - } - else - { - throw CABRTException(EXCEP_PLUGIN, "Unknown/unsupported archive type %s", m_sArchiveType.c_str()); - } -} - -/* Returns the last component of the directory path. - * Careful to not return "" on "/path/path2/", but "path2". - */ -static string DirBase(const char *pStr) -{ - int end = strlen(pStr); - if (end > 1 && pStr[end-1] == '/') - { - end--; - } - int beg = end; - while (beg > 0 && pStr[beg-1] != '/') - { - beg--; - } - return string(pStr + beg, end - beg); -} - -void CFileTransfer::Run(const char *pActionDir, const char *pArgs, int force) -{ - if (strcmp(pArgs, "store") == 0) - { - /* Remember pActiveDir for later sending */ - FILE *dirlist = fopen(FILETRANSFER_DIRLIST, "a"); - if (!dirlist) - { - throw CABRTException(EXCEP_PLUGIN, "Can't open "FILETRANSFER_DIRLIST); - } - fprintf(dirlist, "%s\n", pActionDir); - fclose(dirlist); - VERB3 log("Remembered '%s' for future file transfer", pActionDir); - return; - } - - update_client(_("FileTransfer: Creating a report...")); - - char hostname[HBLEN]; - gethostname(hostname, HBLEN-1); - hostname[HBLEN-1] = '\0'; - - char tmpdir_name[] = "/tmp/abrtuploadXXXXXX"; - /* mkdtemp does mkdir(xxx, 0700), should be safe (is it?) */ - if (mkdtemp(tmpdir_name) == NULL) - { - throw CABRTException(EXCEP_PLUGIN, "Can't mkdir a temporary directory in /tmp"); - } - - if (strcmp(pArgs, "one") == 0) - { - /* Just send one archive */ - string archivename = ssprintf("%s/%s-%s%s", tmpdir_name, hostname, DirBase(pActionDir).c_str(), m_sArchiveType.c_str()); - try - { - CreateArchive(archivename.c_str(), pActionDir); - SendFile(m_sURL.c_str(), archivename.c_str()); - } - catch (CABRTException& e) - { - error_msg(_("Cannot create and send an archive: %s"), e.what()); - } - unlink(archivename.c_str()); - } - else - { - /* Tar up and send all remebered directories */ - FILE *dirlist = fopen(FILETRANSFER_DIRLIST, "r"); - if (!dirlist) - { - /* not an error */ - VERB3 log("No saved crashes to transfer"); - goto del_tmp_dir; - } - - char *dirname; - while ((dirname = xmalloc_fgetline(dirlist)) != NULL) - { - string archivename = ssprintf("%s/%s-%s%s", tmpdir_name, hostname, DirBase(dirname).c_str(), m_sArchiveType.c_str()); - try - { - VERB3 log("Creating archive '%s' of dir '%s'", archivename.c_str(), dirname); - CreateArchive(archivename.c_str(), dirname); - VERB3 log("Sending archive to '%s'", m_sURL.c_str()); - SendFile(m_sURL.c_str(), archivename.c_str()); - } - catch (CABRTException& e) - { - error_msg(_("Cannot create and send an archive: %s"), e.what()); - } - VERB3 log("Deleting archive '%s'", archivename.c_str()); - unlink(archivename.c_str()); - free(dirname); - } - - fclose(dirlist); - /* all the files we're able to send should be sent now, - starting over with clean table */ - unlink(FILETRANSFER_DIRLIST); - } - - del_tmp_dir: - rmdir(tmpdir_name); -} - -void CFileTransfer::SetSettings(const map_plugin_settings_t& pSettings) -{ - m_pSettings = pSettings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - it = pSettings.find("URL"); - if (it != end) - { - m_sURL = it->second; - } - - it = pSettings.find("RetryCount"); - if (it != end) - { - m_nRetryCount = xatoi_u(it->second.c_str()); - } - - it = pSettings.find("RetryDelay"); - if (it != end) - { - m_nRetryDelay = xatoi_u(it->second.c_str()); - } - - it = pSettings.find("ArchiveType"); - if (it != end) - { - /* currently supporting .tar, .tar.gz, .tar.bz2 and .zip */ - m_sArchiveType = it->second; - if (m_sArchiveType[0] != '.') - { - m_sArchiveType = "." + m_sArchiveType; - } - } -} - -//ok to delete? -//const map_plugin_settings_t& CFileTransfer::GetSettings() -//{ -// m_pSettings["URL"] = m_sURL; -// m_pSettings["RetryCount"] = to_string(m_nRetryCount); -// m_pSettings["RetryDelay"] = to_string(m_nRetryDelay); -// m_pSettings["ArchiveType"] = m_sArchiveType; -// -// return m_pSettings; -//} - -PLUGIN_INFO(ACTION, - CFileTransfer, - "FileTransfer", - "0.0.6", - _("Sends a report via FTP or SCTP"), - "dnovotny@redhat.com", - "https://fedorahosted.org/abrt/wiki", - ""); diff --git a/lib/plugins/FileTransfer.h b/lib/plugins/FileTransfer.h deleted file mode 100644 index 17bebf3d..00000000 --- a/lib/plugins/FileTransfer.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - FileTransfer.h - header file for the file transfer plugin - - it uploads the file via ftp or sctp - - Copyright (C) 2009 Daniel Novotny (dnovotny@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef FILETRANSFER_H_ -#define FILETRANSFER_H_ - -#include <string> -#include "plugin.h" -#include "action.h" - -class CFileTransfer : public CAction -{ - private: - std::string m_sURL; - std::string m_sArchiveType; - int m_nRetryCount; - int m_nRetryDelay; - - void CreateArchive(const char *pArchiveName, const char *pDir); - void SendFile(const char *pURL, const char *pFilename); - - public: - CFileTransfer(); - virtual void SetSettings(const map_plugin_settings_t& pSettings); - virtual void Run(const char *pActionDir, const char *pArgs, int force); -}; - -#endif /* FILETRANSFER_H_ */ diff --git a/lib/plugins/Kerneloops.conf b/lib/plugins/Kerneloops.conf deleted file mode 100644 index 67ad07b9..00000000 --- a/lib/plugins/Kerneloops.conf +++ /dev/null @@ -1,13 +0,0 @@ -Enabled = yes - -# Do we want kernel oopses to be visible to any user? -# Set to "yes" for compatibility with kerneloops.org tool. -InformAllUsers = yes - -# Kerneloops Scanner configuration -################################## -SysLogFile = /var/log/messages - -# KerneloopsReporter configuration -################################## -SubmitURL = http://submit.kerneloops.org/submitoops.php diff --git a/lib/plugins/Kerneloops.cpp b/lib/plugins/Kerneloops.cpp deleted file mode 100644 index 37cab992..00000000 --- a/lib/plugins/Kerneloops.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - Authors: - Anton Arapov <anton@redhat.com> - Arjan van de Ven <arjan@linux.intel.com> - */ - -#include "abrtlib.h" -#include "Kerneloops.h" -#include "abrt_exception.h" - -PLUGIN_INFO(ANALYZER, - CAnalyzerKerneloops, - "Kerneloops", - "0.0.2", - _("Analyzes kernel oopses"), - "anton@redhat.com", - "https://people.redhat.com/aarapov", - ""); diff --git a/lib/plugins/Kerneloops.h b/lib/plugins/Kerneloops.h deleted file mode 100644 index 914f1fc8..00000000 --- a/lib/plugins/Kerneloops.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2007, Intel Corporation - * Copyright 2009, Red Hat Inc. - * - * This file is part of Abrt. - * - * This program file is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program in a file named COPYING; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - * - * Authors: - * Anton Arapov <anton@redhat.com> - * Arjan van de Ven <arjan@linux.intel.com> - */ - -#ifndef __INCLUDE_GUARD_KERNELOOPS_H_ -#define __INCLUDE_GUARD_KERNELOOPS_H_ - -#include "plugin.h" -#include "analyzer.h" -#include <string> - -class CAnalyzerKerneloops : public CAnalyzer -{ -}; - -#endif diff --git a/lib/plugins/KerneloopsReporter.cpp b/lib/plugins/KerneloopsReporter.cpp deleted file mode 100644 index ae459737..00000000 --- a/lib/plugins/KerneloopsReporter.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - Authors: - Anton Arapov <anton@redhat.com> - Arjan van de Ven <arjan@linux.intel.com> - */ - -#include "abrtlib.h" -#include "comm_layer_inner.h" -#include "abrt_exception.h" -#include "KerneloopsReporter.h" - -using namespace std; - -CKerneloopsReporter::CKerneloopsReporter() -{ - m_pSettings["SubmitURL"] = "http://submit.kerneloops.org/submitoops.php"; -} - -CKerneloopsReporter::~CKerneloopsReporter() -{ -} - -void CKerneloopsReporter::SetSettings(const map_plugin_settings_t& pSettings) -{ - /* Can't simply do this: - - m_pSettings = pSettings; - - * - it will erase keys which aren't present in pSettings. - * Example: if Bugzilla.conf doesn't have "Login = foo", - * then there's no pSettings["Login"] and m_pSettings = pSettings - * will nuke default m_pSettings["Login"] = "", - * making GUI think that we have no "Login" key at all - * and thus never overriding it - even if it *has* an override! - */ - - map_plugin_settings_t::iterator it = m_pSettings.begin(); - while (it != m_pSettings.end()) - { - map_plugin_settings_t::const_iterator override = pSettings.find(it->first); - if (override != pSettings.end()) - { - VERB3 log(" kerneloops settings[%s]='%s'", it->first.c_str(), it->second.c_str()); - it->second = override->second; - } - it++; - } -} - -string CKerneloopsReporter::Report(const map_crash_data_t& crash_data, - const map_plugin_settings_t& settings, - const char *args) -{ - /* abrt-action-kerneloops [-s] -c /etc/arbt/Kerneloops.conf -c - -d pCrashData.dir NULL */ - char *argv[9]; - char **pp = argv; - *pp++ = (char*)"abrt-action-kerneloops"; - -//We want to consume output, so don't redirect to syslog. -// if (logmode & LOGMODE_SYSLOG) -// *pp++ = (char*)"-s"; -//TODO: the actions<->daemon interaction will be changed anyway... - - *pp++ = (char*)"-c"; - *pp++ = (char*)(PLUGINS_CONF_DIR"/Kerneloops."PLUGINS_CONF_EXTENSION); - *pp++ = (char*)"-c"; - *pp++ = (char*)"-"; - *pp++ = (char*)"-d"; - *pp++ = (char*)get_crash_data_item_content_or_NULL(crash_data, CD_DUMPDIR); - *pp = NULL; - int pipefds[2]; - pid_t pid = fork_execv_on_steroids(EXECFLG_INPUT + EXECFLG_OUTPUT + EXECFLG_ERR2OUT, - argv, - pipefds, - /* unsetenv_vec: */ NULL, - /* dir: */ NULL, - /* uid(unused): */ 0 - ); - - /* Write the configuration to stdin */ - map_plugin_settings_t::const_iterator it = settings.begin(); - while (it != settings.end()) - { - full_write_str(pipefds[1], it->first.c_str()); - full_write_str(pipefds[1], "="); - full_write_str(pipefds[1], it->second.c_str()); - full_write_str(pipefds[1], "\n"); - it++; - } - close(pipefds[1]); - - FILE *fp = fdopen(pipefds[0], "r"); - if (!fp) - die_out_of_memory(); - - /* Consume log from stdout */ - string bug_status; - char *buf; - while ((buf = xmalloc_fgetline(fp)) != NULL) - { - if (strncmp(buf, "STATUS:", 7) == 0) - bug_status = buf + 7; - else - if (strncmp(buf, "EXCEPT:", 7) == 0) - { - CABRTException e(EXCEP_PLUGIN, "%s", buf + 7); - free(buf); - fclose(fp); - waitpid(pid, NULL, 0); - throw e; - } - update_client("%s", buf); - free(buf); - } - - fclose(fp); /* this also closes pipefds[0] */ - /* wait for child to actually exit, and prevent leaving a zombie behind */ - waitpid(pid, NULL, 0); - - return bug_status; -} - -PLUGIN_INFO(REPORTER, - CKerneloopsReporter, - "KerneloopsReporter", - "0.0.1", - _("Sends kernel oops information to kerneloops.org"), - "anton@redhat.com", - "http://people.redhat.com/aarapov", - PLUGINS_LIB_DIR"/KerneloopsReporter.glade"); diff --git a/lib/plugins/KerneloopsReporter.glade b/lib/plugins/KerneloopsReporter.glade deleted file mode 100644 index 1ba287b8..00000000 --- a/lib/plugins/KerneloopsReporter.glade +++ /dev/null @@ -1,118 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">12</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="lSubmitURL"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Submit URL:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_SubmitURL"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Kerneloops Reporter plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button1"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">button1</action-widget> - </action-widgets> - </object> -</interface> diff --git a/lib/plugins/KerneloopsReporter.h b/lib/plugins/KerneloopsReporter.h deleted file mode 100644 index e0f4a1bb..00000000 --- a/lib/plugins/KerneloopsReporter.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2007, Intel Corporation - * Copyright 2009, Red Hat Inc. - * - * This file is part of Abrt. - * - * This program file is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program in a file named COPYING; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - * - * Authors: - * Anton Arapov <anton@redhat.com> - * Arjan van de Ven <arjan@linux.intel.com> - */ - -#ifndef __INCLUDE_GUARD_KERNELOOPSREPORTER_H_ -#define __INCLUDE_GUARD_KERNELOOPSREPORTER_H_ - -#include "plugin.h" -#include "reporter.h" - -#include <string> - -class CKerneloopsReporter : public CReporter -{ - public: - CKerneloopsReporter(); - ~CKerneloopsReporter(); - - virtual void SetSettings(const map_plugin_settings_t& pSettings); - virtual std::string Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs); -}; - -#endif diff --git a/lib/plugins/KerneloopsScanner.cpp b/lib/plugins/KerneloopsScanner.cpp deleted file mode 100644 index d187daa9..00000000 --- a/lib/plugins/KerneloopsScanner.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - Authors: - Anton Arapov <anton@redhat.com> - Arjan van de Ven <arjan@linux.intel.com> -*/ -#include <syslog.h> -#include <asm/unistd.h> /* __NR_syslog */ -#include <glib.h> -#include "abrtlib.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" -#include "KerneloopsSysLog.h" -#include "KerneloopsScanner.h" - -// TODO: https://fedorahosted.org/abrt/ticket/78 - -static int scan_dmesg(GList **oopsList) -{ - VERB1 log("Scanning dmesg"); - - /* syslog(3) - read the last len bytes from the log buffer - * (non-destructively), but dont read more than was written - * into the buffer since the last"clear ring buffer" cmd. - * Returns the number of bytes read. - */ - char *buffer = (char*)xzalloc(16*1024); - syscall(__NR_syslog, 3, buffer, 16*1024 - 1); /* always NUL terminated */ - int cnt_FoundOopses = extract_oopses(oopsList, buffer, strlen(buffer)); - free(buffer); - - return cnt_FoundOopses; -} - - -/* "dumpoops" tool uses these two functions too */ -extern "C" { - -int scan_syslog_file(GList **oopsList, const char *filename, time_t *last_changed_p) -{ - VERB1 log("Scanning syslog file '%s'", filename); - - char *buffer; - struct stat statb; - int fd; - int cnt_FoundOopses; - ssize_t sz; - fd = open(filename, O_RDONLY); - if (fd < 0) - return 0; - statb.st_size = 0; /* paranoia */ - if (fstat(fd, &statb) != 0 || statb.st_size < 1) - { - close(fd); - return 0; - } - - if (last_changed_p != NULL) - { - if (*last_changed_p == statb.st_mtime) - { - VERB1 log("Syslog file '%s' hasn't changed since last scan, skipping", filename); - close(fd); - return 0; - } - *last_changed_p = statb.st_mtime; - } - - /* - * In theory we have 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 10kbytes extra. If there's - * more than that.. any oops will be in dmesg anyway. - * Do not try to allocate an absurd 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. - */ - sz = statb.st_size + 10*1024; - if (statb.st_size > (32*1024*1024 - 10*1024)) - { - xlseek(fd, statb.st_size - (32*1024*1024 - 10*1024), SEEK_SET); - sz = 32*1024*1024; - } - buffer = (char*)xzalloc(sz); - sz = full_read(fd, buffer, sz); - close(fd); - - cnt_FoundOopses = 0; - if (sz > 0) - cnt_FoundOopses = extract_oopses(oopsList, buffer, sz); - free(buffer); - - return cnt_FoundOopses; -} - -/* returns number of errors */ -int save_oops_to_debug_dump(GList **oopsList) -{ - unsigned countdown = 16; /* do not report hundreds of oopses */ - unsigned idx = g_list_length(*oopsList); - time_t t = time(NULL); - pid_t my_pid = getpid(); - - VERB1 log("Saving %u oopses as crash dump dirs", idx >= countdown ? countdown-1 : idx); - - int errors = 0; - - while (idx != 0 && --countdown != 0) - { - char path[sizeof(DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu") + 3 * sizeof(long)*3]; - sprintf(path, DEBUG_DUMPS_DIR"/kerneloops-%lu-%lu-%lu", (long)t, (long)my_pid, (long)idx); - - char *first_line = (char*)g_list_nth_data(*oopsList,--idx); - char *second_line = (char*)strchr(first_line, '\n'); /* never NULL */ - *second_line++ = '\0'; - - struct dump_dir *dd = dd_create(path, /*uid:*/ 0); - if (dd) - { - dd_save_text(dd, FILENAME_ANALYZER, "Kerneloops"); - dd_save_text(dd, FILENAME_EXECUTABLE, "kernel"); - dd_save_text(dd, FILENAME_KERNEL, first_line); - dd_save_text(dd, FILENAME_CMDLINE, "not_applicable"); - dd_save_text(dd, FILENAME_BACKTRACE, second_line); - /* Optional, makes generated bz more informative */ - strchrnul(second_line, '\n')[0] = '\0'; - dd_save_text(dd, FILENAME_REASON, second_line); - dd_close(dd); - } - else - errors++; - } - - return errors; -} - -} /* extern "C" */ - - -CKerneloopsScanner::CKerneloopsScanner() -{ - int cnt_FoundOopses; - m_syslog_last_change = 0; - - /* Scan dmesg, on first call only */ - GList *oopsList = NULL; - cnt_FoundOopses = scan_dmesg(&oopsList); - if (cnt_FoundOopses > 0) - { - int errors = save_oops_to_debug_dump(&oopsList); - if (errors > 0) - log("%d errors while dumping oopses", errors); - } -} - -void CKerneloopsScanner::Run(const char *pActionDir, const char *pArgs, int force) -{ - const char *syslog_file = "/var/log/messages"; - map_plugin_settings_t::const_iterator it = m_pSettings.find("SysLogFile"); - if (it != m_pSettings.end()) - syslog_file = it->second.c_str(); - - GList *oopsList = NULL; - int cnt_FoundOopses = scan_syslog_file(&oopsList, syslog_file, &m_syslog_last_change); - if (cnt_FoundOopses > 0) - { - int errors = save_oops_to_debug_dump(&oopsList); - if (errors > 0) - log("%d errors while dumping oopses", errors); - /* - * This marker in syslog file prevents us from - * re-parsing old oopses (any oops before it is - * ignored by scan_syslog_file()). The only problem - * is that we can't be sure here that syslog_file - * is the file where syslog(xxx) stuff ends up. - */ - openlog("abrt", 0, LOG_KERN); - syslog(LOG_WARNING, - "Kerneloops: Reported %u kernel oopses to Abrt", - cnt_FoundOopses); - closelog(); - } - - for (GList *li = oopsList; li != NULL; li = g_list_next(li)) - free((char*)li->data); - g_list_free(oopsList); -} - -PLUGIN_INFO(ACTION, - CKerneloopsScanner, - "KerneloopsScanner", - "0.0.1", - _("Periodically scans for and saves kernel oopses"), - "anton@redhat.com", - "http://people.redhat.com/aarapov", - ""); diff --git a/lib/plugins/KerneloopsScanner.h b/lib/plugins/KerneloopsScanner.h deleted file mode 100644 index 2bddb0f4..00000000 --- a/lib/plugins/KerneloopsScanner.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2007, Intel Corporation - * Copyright 2009, Red Hat Inc. - * - * This file is part of Abrt. - * - * This program file is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program in a file named COPYING; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - * - * Authors: - * Anton Arapov <anton@redhat.com> - * Arjan van de Ven <arjan@linux.intel.com> - */ -#ifndef KERNELOOPSSCANNER_H_ -#define KERNELOOPSSCANNER_H_ - -#include "abrt_types.h" -#include "plugin.h" -#include "action.h" - -class CKerneloopsScanner : public CAction -{ - private: - time_t m_syslog_last_change; - public: - CKerneloopsScanner(); - virtual void Run(const char *pActionDir, const char *pArgs, int force); -}; - -#endif diff --git a/lib/plugins/KerneloopsSysLog.cpp b/lib/plugins/KerneloopsSysLog.cpp deleted file mode 100644 index 68f309bc..00000000 --- a/lib/plugins/KerneloopsSysLog.cpp +++ /dev/null @@ -1,383 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - Authors: - Anton Arapov <anton@redhat.com> - Arjan van de Ven <arjan@linux.intel.com> - */ -#include "abrtlib.h" -#include "KerneloopsSysLog.h" -#include <glib.h> - -static void queue_oops(GList **vec, const char *data, const char *version) -{ - char *ver_data = xasprintf("%s\n%s", version, data); - *vec = g_list_append(*vec, ver_data); -} - -/* - * extract_version tries to find the kernel version in given data - */ -static char *extract_version(const char *linepointer) -{ - if (strstr(linepointer, "Pid") - || strstr(linepointer, "comm") - || strstr(linepointer, "CPU") - || strstr(linepointer, "REGS") - || strstr(linepointer, "EFLAGS") - ) { - char* start; - char* end; - - start = strstr((char*)linepointer, "2.6."); - if (start) - { - end = strchr(start, ')'); - if (!end) - end = strchrnul(start, ' '); - return xstrndup(start, end-start); - } - } - - return NULL; -} - -/* - * extract_oops tries to find oops signatures in a log - */ -struct line_info { - char *ptr; - char level; -}; - -static int record_oops(GList **oopses, struct line_info* lines_info, int oopsstart, int oopsend) -{ - int q; - int len; - char *oops; - char *version; - - len = 2; - for (q = oopsstart; q <= oopsend; q++) - len += strlen(lines_info[q].ptr) + 1; - - oops = (char*)xzalloc(len); - - version = NULL; - for (q = oopsstart; q <= oopsend; q++) - { - if (!version) - version = extract_version(lines_info[q].ptr); - - if (lines_info[q].ptr[0]) - { - strcat(oops, lines_info[q].ptr); - strcat(oops, "\n"); - } - } - int rv = 1; - /* too short oopses are invalid */ - if (strlen(oops) > 100) - queue_oops(oopses, oops, version ? version : "undefined"); - else - { - VERB3 log("Dropped oops: too short"); - rv = 0; - } - free(oops); - free(version); - return rv; -} -#define REALLOC_CHUNK 1000 -int extract_oopses(GList **oopses, char *buffer, size_t buflen) -{ - char *c; - int linecount = 0; - int lines_info_alloc = 0; - struct line_info *lines_info = NULL; - - /* Split buffer into lines */ - - if (buflen != 0) - buffer[buflen - 1] = '\n'; /* the buffer usually ends with \n, but let's make sure */ - c = buffer; - while (c < buffer + buflen) - { - char linelevel; - char *c9; - char *colon; - - c9 = (char*)memchr(c, '\n', buffer + buflen - c); /* a \n will always be found */ - assert(c9); - *c9 = '\0'; /* turn the \n into a string termination */ - if (c9 == c) - goto next_line; - - /* Is it a syslog file (/var/log/messages or similar)? - * Even though _usually_ it looks like "Nov 19 12:34:38 localhost kernel: xxx", - * some users run syslog in non-C locale: - * "2010-02-22T09:24:08.156534-08:00 gnu-4 gnome-session[2048]: blah blah" - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !!! - * We detect it by checking for N:NN:NN pattern in first 15 chars - * (and this still is not good enough... false positive: "pci 0000:15:00.0: PME# disabled") - */ - colon = strchr(c, ':'); - if (colon && colon > c && colon < c + 15 - && isdigit(colon[-1]) /* N:... */ - && isdigit(colon[1]) /* ...N:NN:... */ - && isdigit(colon[2]) - && colon[3] == ':' - && isdigit(colon[4]) /* ...N:NN:NN... */ - && isdigit(colon[5]) - ) { - /* It's syslog file, not a bare dmesg */ - - /* Skip non-kernel lines */ - char *kernel_str = strstr(c, "kernel: "); - if (kernel_str == NULL) - { - /* if we see our own marker: - * "hostname abrt: Kerneloops: Reported 1 kernel oopses to Abrt" - * we know we submitted everything upto here already */ - if (strstr(c, "abrt:") && strstr(c, "Abrt")) - { - VERB3 log("Found our marker at line %d, restarting line count from 0", linecount); - linecount = 0; - lines_info_alloc = 0; - free(lines_info); - lines_info = NULL; - } - goto next_line; - } - c = kernel_str + sizeof("kernel: ")-1; - } - - linelevel = 0; - /* store and remove kernel log level */ - if (*c == '<' && c[1] && c[2] == '>') - { - linelevel = c[1]; - c += 3; - } - /* remove jiffies time stamp counter if present */ - if (*c == '[') - { - char *c2 = strchr(c, '.'); - char *c3 = strchr(c, ']'); - if (c2 && c3 && (c2 < c3) && (c3-c) < 14 && (c2-c) < 8) - { - c = c3 + 1; - if (*c == ' ') - c++; - } - } - if (linecount >= lines_info_alloc) - { - lines_info_alloc += REALLOC_CHUNK; - lines_info = (line_info*)xrealloc(lines_info, - lines_info_alloc * sizeof(struct line_info)); - } - lines_info[linecount].ptr = c; - lines_info[linecount].level = linelevel; - linecount++; -next_line: - c = c9 + 1; - } - - /* Analyze lines */ - - int i; - char prevlevel = 0; - int oopsstart = -1; - int inbacktrace = 0; - int oopsesfound = 0; - - i = 0; - while (i < linecount) - { - char *curline = lines_info[i].ptr; - - if (curline == NULL) - { - i++; - continue; - } - while (*curline == ' ') - curline++; - - if (oopsstart < 0) - { - /* find start-of-oops markers */ - if (strstr(curline, "general protection fault:")) - oopsstart = i; - else if (strstr(curline, "BUG:")) - oopsstart = i; - else if (strstr(curline, "kernel BUG at")) - oopsstart = i; - else if (strstr(curline, "do_IRQ: stack overflow:")) - oopsstart = i; - else if (strstr(curline, "RTNL: assertion failed")) - oopsstart = i; - else if (strstr(curline, "Eeek! page_mapcount(page) went negative!")) - oopsstart = i; - else if (strstr(curline, "near stack overflow (cur:")) - oopsstart = i; - else if (strstr(curline, "double fault:")) - oopsstart = i; - else if (strstr(curline, "Badness at")) - oopsstart = i; - else if (strstr(curline, "NETDEV WATCHDOG")) - oopsstart = i; - else if (strstr(curline, "WARNING: at ")) /* WARN_ON() generated message */ - oopsstart = i; - else if (strstr(curline, "Unable to handle kernel")) - oopsstart = i; - else if (strstr(curline, "sysctl table check failed")) - oopsstart = i; - else if (strstr(curline, "INFO: possible recursive locking detected")) - oopsstart = i; - // Not needed: "--[ cut here ]--" is always followed - // by "Badness at", "kernel BUG at", or "WARNING: at" string - //else if (strstr(curline, "------------[ cut here ]------------")) - // oopsstart = i; - else if (strstr(curline, "list_del corruption.")) - oopsstart = i; - else if (strstr(curline, "list_add corruption.")) - oopsstart = i; - if (strstr(curline, "Oops:") && i >= 3) - oopsstart = i-3; - - if (oopsstart >= 0) - { - /* debug information */ - VERB3 { - log("Found oops at line %d: '%s'", oopsstart, lines_info[oopsstart].ptr); - if (oopsstart != i) - log("Trigger line is %d: '%s'", i, c); - } - /* try to find the end marker */ - int i2 = i + 1; - while (i2 < linecount && i2 < (i+50)) - { - if (strstr(lines_info[i2].ptr, "---[ end trace")) - { - inbacktrace = 1; - i = i2; - break; - } - i2++; - } - } - } - - /* Are we entering a call trace part? */ - /* a call trace starts with "Call Trace:" or with the " [<.......>] function+0xFF/0xAA" pattern */ - if (oopsstart >= 0 && !inbacktrace) - { - if (strstr(curline, "Call Trace:")) - inbacktrace = 1; - else - if (strnlen(curline, 9) > 8 - && curline[0] == '[' && curline[1] == '<' - && strstr(curline, ">]") - && strstr(curline, "+0x") - && strstr(curline, "/0x") - ) { - inbacktrace = 1; - } - } - - /* Are we at the end of an oops? */ - else if (oopsstart >= 0 && inbacktrace) - { - int oopsend = INT_MAX; - - /* line needs to start with " [" or have "] [" if it is still a call trace */ - /* example: "[<ffffffffa006c156>] radeon_get_ring_head+0x16/0x41 [radeon]" */ - if (curline[0] != '[' - && !strstr(curline, "] [") - && !strstr(curline, "--- Exception") - && !strstr(curline, "LR =") - && !strstr(curline, "<#DF>") - && !strstr(curline, "<IRQ>") - && !strstr(curline, "<EOI>") - && !strstr(curline, "<<EOE>>") - && strncmp(curline, "Code: ", 6) != 0 - && strncmp(curline, "RIP ", 4) != 0 - && strncmp(curline, "RSP ", 4) != 0 - ) { - oopsend = i-1; /* not a call trace line */ - } - /* oops lines are always more than 8 chars long */ - else if (strnlen(curline, 8) < 8) - oopsend = i-1; - /* single oopses are of the same loglevel */ - else if (lines_info[i].level != prevlevel) - oopsend = i-1; - else if (strstr(curline, "Instruction dump:")) - oopsend = i; - /* if a new oops starts, this one has ended */ - else if (strstr(curline, "WARNING: at ") && oopsstart != i) /* WARN_ON() generated message */ - oopsend = i-1; - else if (strstr(curline, "Unable to handle") && oopsstart != i) - oopsend = i-1; - /* kernel end-of-oops marker (not including marker itself) */ - else if (strstr(curline, "---[ end trace")) - oopsend = i-1; - - if (oopsend <= i) - { - VERB3 log("End of oops at line %d (%d): '%s'", oopsend, i, lines_info[oopsend].ptr); - if (record_oops(oopses, lines_info, oopsstart, oopsend)) - oopsesfound++; - oopsstart = -1; - inbacktrace = 0; - } - } - - prevlevel = lines_info[i].level; - i++; - - if (oopsstart >= 0) - { - /* Do we have a suspiciously long oops? Cancel it */ - if (i-oopsstart > 60) - { - inbacktrace = 0; - oopsstart = -1; - VERB3 log("Dropped oops, too long"); - continue; - } - if (!inbacktrace && i-oopsstart > 40) - { - /*inbacktrace = 0; - already is */ - oopsstart = -1; - VERB3 log("Dropped oops, too long"); - continue; - } - } - } /* while (i < linecount) */ - - /* process last oops if we have one */ - if (oopsstart >= 0 && inbacktrace) - { - int oopsend = i-1; - VERB3 log("End of oops at line %d (end of file): '%s'", oopsend, lines_info[oopsend].ptr); - if (record_oops(oopses, lines_info, oopsstart, oopsend)) - oopsesfound++; - } - - free(lines_info); - return oopsesfound; -} diff --git a/lib/plugins/KerneloopsSysLog.h b/lib/plugins/KerneloopsSysLog.h deleted file mode 100644 index d8b4d32b..00000000 --- a/lib/plugins/KerneloopsSysLog.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2007, Intel Corporation - * Copyright 2009, Red Hat Inc. - * - * This file is part of Abrt. - * - * This program file is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program in a file named COPYING; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - * - * Authors: - * Anton Arapov <anton@redhat.com> - * Arjan van de Ven <arjan@linux.intel.com> - */ - -#ifndef __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_ -#define __INCLUDE_GUARD_KERNELOOPSSYSLOG_H_ - -#include "abrt_types.h" -#include <glib.h> - -int extract_oopses(GList **oopses, char *buffer, size_t buflen); - -#endif diff --git a/lib/plugins/Logger.conf b/lib/plugins/Logger.conf deleted file mode 100644 index aadd3515..00000000 --- a/lib/plugins/Logger.conf +++ /dev/null @@ -1,8 +0,0 @@ -# Description: Writes report to a file - -# Configuration for Logger plugin -Enabled = yes - -LogPath = /var/log/abrt.log - -AppendLogs = yes diff --git a/lib/plugins/Logger.glade b/lib/plugins/Logger.glade deleted file mode 100644 index a0a909a4..00000000 --- a/lib/plugins/Logger.glade +++ /dev/null @@ -1,135 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">12</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="lLogPath"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Logger file:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_LogPath"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_AppendLogs"> - <property name="label" translatable="yes">Append new logs</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Logger plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button1"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">button1</action-widget> - </action-widgets> - </object> -</interface> diff --git a/lib/plugins/Mailx.conf b/lib/plugins/Mailx.conf deleted file mode 100644 index 1d946427..00000000 --- a/lib/plugins/Mailx.conf +++ /dev/null @@ -1,17 +0,0 @@ -# Description: Sends an email with a report (using mailx command) - -# Configuration to Email reporter plugin -Enabled = yes - -# In abrt.conf, plugin takes one parameter: subject (in "" if you need to embed spaces). -# If it isn't specified, then a default subject is taken from this file -Subject = "[abrt] crash report" - -# Your Email -EmailFrom = user@localhost - -# Email To -EmailTo = root@localhost - -# Warning! enabling this may cause sending a lot of MB via email -SendBinaryData = no diff --git a/lib/plugins/Mailx.cpp b/lib/plugins/Mailx.cpp deleted file mode 100644 index 255c873d..00000000 --- a/lib/plugins/Mailx.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - Mailx.cpp - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include "abrtlib.h" -#include "Mailx.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" - -#define MAILX_COMMAND "/bin/mailx" - -CMailx::CMailx() -{ - m_email_from = xstrdup("user@localhost"); - m_email_to = xstrdup("root@localhost"); - m_subject = xstrdup("[abrt] full crash report"); - m_send_binary_data = false; -} - -CMailx::~CMailx() -{ - free(m_email_from); - free(m_email_to); - free(m_subject); -} - -static void exec_and_feed_input(uid_t uid, const char* text, char **args) -{ - int pipein[2]; - - pid_t child = fork_execv_on_steroids( - EXECFLG_INPUT | EXECFLG_QUIET | EXECFLG_SETGUID, - args, - pipein, - /*unsetenv_vec:*/ NULL, - /*dir:*/ NULL, - uid); - - full_write_str(pipein[1], text); - close(pipein[1]); - - waitpid(child, NULL, 0); /* wait for command completion */ -} - -static char** append_str_to_vector(char **vec, unsigned &size, const char *str) -{ - //log("old vec: %p", vec); - vec = (char**) xrealloc(vec, (size+2) * sizeof(vec[0])); - vec[size] = xstrdup(str); - //log("new vec: %p, added [%d] %p", vec, size, vec[size]); - size++; - vec[size] = NULL; - return vec; -} - -std::string CMailx::Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs) -{ - SetSettings(pSettings); - char **args = NULL; - unsigned arg_size = 0; - args = append_str_to_vector(args, arg_size, MAILX_COMMAND); - - char *dsc = make_dsc_mailx(pCrashData); - - map_crash_data_t::const_iterator it; - for (it = pCrashData.begin(); it != pCrashData.end(); it++) - { - if (it->second[CD_TYPE] == CD_BIN && m_send_binary_data) - { - args = append_str_to_vector(args, arg_size, "-a"); - args = append_str_to_vector(args, arg_size, it->second[CD_CONTENT].c_str()); - } - } - - args = append_str_to_vector(args, arg_size, "-s"); - args = append_str_to_vector(args, arg_size, (pArgs[0] != '\0' ? pArgs : m_subject)); - args = append_str_to_vector(args, arg_size, "-r"); - args = append_str_to_vector(args, arg_size, m_email_from); - args = append_str_to_vector(args, arg_size, m_email_to); - - update_client(_("Sending an email...")); - const char *uid_str = get_crash_data_item_content_or_NULL(pCrashData, CD_UID); - exec_and_feed_input(xatoi_u(uid_str), dsc, args); - - free(dsc); - - while (*args) - { - free(*args++); - } - args -= arg_size; - free(args); - - return ssprintf("Email was sent to: %s", m_email_to); -} - -void CMailx::SetSettings(const map_plugin_settings_t& pSettings) -{ - m_pSettings = pSettings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - it = pSettings.find("Subject"); - if (it != end) - { - free(m_subject); - m_subject = xstrdup(it->second.c_str()); - } - it = pSettings.find("EmailFrom"); - if (it != end) - { - free(m_email_from); - m_email_from = xstrdup(it->second.c_str()); - } - it = pSettings.find("EmailTo"); - if (it != end) - { - free(m_email_to); - m_email_to = xstrdup(it->second.c_str()); - } - it = pSettings.find("SendBinaryData"); - if (it != end) - { - m_send_binary_data = string_to_bool(it->second.c_str()); - } -} - -PLUGIN_INFO(REPORTER, - CMailx, - "Mailx", - "0.0.2", - _("Sends an email with a report (via mailx command)"), - "zprikryl@redhat.com", - "https://fedorahosted.org/abrt/wiki", - PLUGINS_LIB_DIR"/Mailx.glade"); diff --git a/lib/plugins/Mailx.glade b/lib/plugins/Mailx.glade deleted file mode 100644 index 656204b5..00000000 --- a/lib/plugins/Mailx.glade +++ /dev/null @@ -1,184 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">12</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="lSubject"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Subject:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Subject"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_EmailFrom"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lEmailFrom"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Your Email:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lEmailTo"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Recipient's Email:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_EmailTo"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_SendBinaryData"> - <property name="label" translatable="yes">Send Binary Data</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Mailx plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button1"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">button1</action-widget> - </action-widgets> - </object> -</interface> diff --git a/lib/plugins/Mailx.h b/lib/plugins/Mailx.h deleted file mode 100644 index 326a6371..00000000 --- a/lib/plugins/Mailx.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - Mailx.h - header file for Mailx reporter plugin - - it simple sends an email to specific address via mailx command - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef MAILX_H_ -#define MAILX_H_ - -#include <string> -#include "plugin.h" -#include "reporter.h" - -class CMailx : public CReporter -{ - private: - char *m_email_from; - char *m_email_to; - char *m_subject; - bool m_send_binary_data; - - public: - CMailx(); - ~CMailx(); - - virtual void SetSettings(const map_plugin_settings_t& pSettings); - - virtual std::string Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs); -}; - -#endif diff --git a/lib/plugins/Makefile.am b/lib/plugins/Makefile.am deleted file mode 100644 index caf5ea27..00000000 --- a/lib/plugins/Makefile.am +++ /dev/null @@ -1,138 +0,0 @@ -AM_CPPFLAGS = -I$(srcdir)/../../inc -I$(srcdir)/../utils -pluginslibdir=$(PLUGINS_LIB_DIR) -pluginslib_LTLIBRARIES = \ - libCCpp.la \ - libMailx.la \ - libSQLite3.la \ - libKerneloopsScanner.la\ - libKerneloops.la \ - libKerneloopsReporter.la \ - libSOSreport.la \ - libBugzilla.la \ - libRHTSupport.la \ - libReportUploader.la \ - libPython.la \ - libFileTransfer.la - -dist_pluginslib_DATA = \ - Logger.glade \ - Mailx.glade \ - Bugzilla.glade \ - RHTSupport.glade \ - ReportUploader.glade \ - KerneloopsReporter.glade - -pluginsconfdir = $(PLUGINS_CONF_DIR) -dist_pluginsconf_DATA = \ - CCpp.conf \ - Mailx.conf \ - SQLite3.conf \ - Logger.conf \ - Kerneloops.conf \ - Bugzilla.conf \ - RHTSupport.conf \ - ReportUploader.conf \ - FileTransfer.conf \ - Python.conf \ - SOSreport.conf - -man_MANS = \ - abrt-FileTransfer.7 \ - abrt-Bugzilla.7 \ - abrt-KerneloopsScanner.7 \ - abrt-KerneloopsReporter.7 \ - abrt-Logger.7 \ - abrt-Mailx.7 \ - abrt-plugins.7 \ - abrt-SQLite3.7 \ - abrt-ReportUploader.7 - -EXTRA_DIST = $(man_MANS) - -$(DESTDIR)/$(DEBUG_INFO_DIR): - $(mkdir_p) '$@' - -install-data-hook: $(DESTDIR)/$(DEBUG_INFO_DIR) - sed 's: = /var/: = $(localstatedir)/:g' -i \ - $(DESTDIR)$(sysconfdir)/abrt/plugins/SQLite3.conf \ - $(DESTDIR)$(sysconfdir)/abrt/plugins/Logger.conf - -INC_PATH=$(srcdir)/../../inc -UTILS_PATH=$(srcdir)/../utils - -# CCpp -libCCpp_la_SOURCES = CCpp.cpp CCpp.h -libCCpp_la_LDFLAGS = -avoid-version -libCCpp_la_CPPFLAGS = -Wall -Werror \ - -I$(INC_PATH) -I$(UTILS_PATH) \ - -DCCPP_HOOK_PATH=\"${libexecdir}/abrt-hook-ccpp\" \ - -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" \ - -DLOCALSTATEDIR='"$(localstatedir)"' -# -DHOSTILE_KERNEL - -# Kerneloops -libKerneloops_la_SOURCES = Kerneloops.cpp Kerneloops.h -libKerneloops_la_LDFLAGS = -avoid-version -libKerneloops_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) - -# KerneloopsReporter -libKerneloopsReporter_la_SOURCES = KerneloopsReporter.cpp KerneloopsReporter.h -libKerneloopsReporter_la_LDFLAGS = -avoid-version -libKerneloopsReporter_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" - -# KerneloopsScanner -libKerneloopsScanner_la_SOURCES = KerneloopsScanner.cpp KerneloopsScanner.h KerneloopsSysLog.cpp KerneloopsSysLog.h -libKerneloopsScanner_la_LDFLAGS = -avoid-version $(GLIB_LIBS) -libKerneloopsScanner_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" $(GLIB_CFLAGS) - -# Mailx -libMailx_la_SOURCES = Mailx.cpp Mailx.h -libMailx_la_LDFLAGS = -avoid-version -libMailx_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" -DLOCALSTATEDIR='"$(localstatedir)"' - -# SQLite3 -libSQLite3_la_SOURCES = SQLite3.cpp SQLite3.h -libSQLite3_la_LDFLAGS = -avoid-version -libSQLite3_la_LIBADD = $(SQLITE3_LIBS) $(GLIB_LIBS) -libSQLite3_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(SQLITE3_CFLAGS) -DLOCALSTATEDIR='"$(localstatedir)"' $(GLIB_CFLAGS) - -# SOSreport -libSOSreport_la_SOURCES = SOSreport.cpp SOSreport.h -libSOSreport_la_LDFLAGS = -avoid-version - -# Bugzilla -libBugzilla_la_SOURCES = Bugzilla.h Bugzilla.cpp -libBugzilla_la_LIBADD = -libBugzilla_la_LDFLAGS = -avoid-version -libBugzilla_la_CPPFLAGS = \ - -I$(INC_PATH) -I$(UTILS_PATH) \ - -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ - -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" - -# RHTSupport -libRHTSupport_la_SOURCES = RHTSupport.h RHTSupport.cpp -libRHTSupport_la_LIBADD = -libRHTSupport_la_LDFLAGS = -avoid-version -libRHTSupport_la_CPPFLAGS = \ - -I$(INC_PATH) -I$(UTILS_PATH) \ - -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" \ - -DPLUGINS_CONF_DIR=\"$(PLUGINS_CONF_DIR)\" \ - -DLOCALSTATEDIR='"$(localstatedir)"' - -# ReportUploader -libReportUploader_la_SOURCES = ReportUploader.h ReportUploader.cpp -libReportUploader_la_LDFLAGS = -avoid-version -libReportUploader_la_LIBADD = $(CURL_LIBS) -libReportUploader_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(CURL_CFLAGS) -DPLUGINS_LIB_DIR=\"$(PLUGINS_LIB_DIR)\" - -# Python -libPython_la_SOURCES = Python.h Python.cpp -#libPython_la_LIBADD = $(NSS_LIBS) -libPython_la_LDFLAGS = -avoid-version -libPython_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) - -# FileTrasfer -libFileTransfer_la_SOURCES = FileTransfer.cpp FileTransfer.h -libFileTransfer_la_LDFLAGS = -avoid-version -ltar -lbz2 -lz -libFileTransfer_la_LIBADD = $(CURL_LIBS) -libFileTransfer_la_CPPFLAGS = -I$(INC_PATH) -I$(UTILS_PATH) $(CURL_CFLAGS) -DDEBUG_DUMPS_DIR=\"$(DEBUG_DUMPS_DIR)\" diff --git a/lib/plugins/Python.conf b/lib/plugins/Python.conf deleted file mode 100644 index 3201c6da..00000000 --- a/lib/plugins/Python.conf +++ /dev/null @@ -1 +0,0 @@ -Enabled = yes diff --git a/lib/plugins/Python.cpp b/lib/plugins/Python.cpp deleted file mode 100644 index e955b5fb..00000000 --- a/lib/plugins/Python.cpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include "abrtlib.h" -#include "Python.h" -#include "abrt_exception.h" - -PLUGIN_INFO(ANALYZER, - CAnalyzerPython, - "Python", - "0.0.1", - _("Analyzes crashes in Python programs"), - "zprikryl@redhat.com, jmoskovc@redhat.com", - "https://fedorahosted.org/abrt/wiki", - ""); diff --git a/lib/plugins/Python.h b/lib/plugins/Python.h deleted file mode 100644 index 3f01d2c6..00000000 --- a/lib/plugins/Python.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef PYTHON_H_ -#define PYTHON_H_ - -#include <string> -#include "plugin.h" -#include "analyzer.h" - -class CAnalyzerPython : public CAnalyzer -{ -}; - -#endif /* PYTHON_H_ */ diff --git a/lib/plugins/RHTSupport.conf b/lib/plugins/RHTSupport.conf deleted file mode 100644 index ecd5992a..00000000 --- a/lib/plugins/RHTSupport.conf +++ /dev/null @@ -1,11 +0,0 @@ -# Description: Reports crashes to Red Hat support - -Enabled = yes - -URL = https://api.access.redhat.com/rs -# No means that ssl certificates will not be checked -SSLVerify = yes -# Your login has to exist -Login = -# Your password -Password = diff --git a/lib/plugins/RHTSupport.cpp b/lib/plugins/RHTSupport.cpp deleted file mode 100644 index 3732afe3..00000000 --- a/lib/plugins/RHTSupport.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "abrtlib.h" -#include "crash_types.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" -#include "RHTSupport.h" - -using namespace std; - -CReporterRHticket::CReporterRHticket() -{ - m_pSettings["URL"] = "https://api.access.redhat.com/rs"; - m_pSettings["Login"] = ""; - m_pSettings["Password"] = ""; - m_pSettings["SSLVerify"] = "yes"; -} - -CReporterRHticket::~CReporterRHticket() -{ -} - -void CReporterRHticket::SetSettings(const map_plugin_settings_t& pSettings) -{ - /* Can't simply do this: - - m_pSettings = pSettings; - - * - it will erase keys which aren't present in pSettings. - * Example: if Bugzilla.conf doesn't have "Login = foo", - * then there's no pSettings["Login"] and m_pSettings = pSettings - * will nuke default m_pSettings["Login"] = "", - * making GUI think that we have no "Login" key at all - * and thus never overriding it - even if it *has* an override! - */ - - map_plugin_settings_t::iterator it = m_pSettings.begin(); - while (it != m_pSettings.end()) - { - map_plugin_settings_t::const_iterator override = pSettings.find(it->first); - if (override != pSettings.end()) - { - VERB3 log(" rhtsupport settings[%s]='%s'", it->first.c_str(), it->second.c_str()); - it->second = override->second; - } - it++; - } -} - -string CReporterRHticket::Report(const map_crash_data_t& crash_data, - const map_plugin_settings_t& settings, - const char *args) -{ - /* abrt-action-rhtsupport [-s] -c /etc/arbt/RHTSupport.conf -c - -d pCrashData.dir NULL */ - char *argv[9]; - char **pp = argv; - *pp++ = (char*)"abrt-action-rhtsupport"; - -//We want to consume output, so don't redirect to syslog. -// if (logmode & LOGMODE_SYSLOG) -// *pp++ = (char*)"-s"; -//TODO: the actions<->daemon interaction will be changed anyway... - - *pp++ = (char*)"-c"; - *pp++ = (char*)(PLUGINS_CONF_DIR"/RHTSupport."PLUGINS_CONF_EXTENSION); - *pp++ = (char*)"-c"; - *pp++ = (char*)"-"; - *pp++ = (char*)"-d"; - *pp++ = (char*)get_crash_data_item_content_or_NULL(crash_data, CD_DUMPDIR); - *pp = NULL; - int pipefds[2]; - pid_t pid = fork_execv_on_steroids(EXECFLG_INPUT + EXECFLG_OUTPUT + EXECFLG_ERR2OUT, - argv, - pipefds, - /* unsetenv_vec: */ NULL, - /* dir: */ NULL, - /* uid(unused): */ 0 - ); - - /* Write the configuration to stdin */ - map_plugin_settings_t::const_iterator it = settings.begin(); - while (it != settings.end()) - { - full_write_str(pipefds[1], it->first.c_str()); - full_write_str(pipefds[1], "="); - full_write_str(pipefds[1], it->second.c_str()); - full_write_str(pipefds[1], "\n"); - it++; - } - close(pipefds[1]); - - FILE *fp = fdopen(pipefds[0], "r"); - if (!fp) - die_out_of_memory(); - - /* Consume log from stdout */ - string bug_status; - char *buf; - while ((buf = xmalloc_fgetline(fp)) != NULL) - { - if (strncmp(buf, "STATUS:", 7) == 0) - bug_status = buf + 7; - else - if (strncmp(buf, "EXCEPT:", 7) == 0) - { - CABRTException e(EXCEP_PLUGIN, "%s", buf + 7); - free(buf); - fclose(fp); - waitpid(pid, NULL, 0); - throw e; - } - update_client("%s", buf); - free(buf); - } - - fclose(fp); /* this also closes pipefds[0] */ - /* wait for child to actually exit, and prevent leaving a zombie behind */ - waitpid(pid, NULL, 0); - - return bug_status; -} - -PLUGIN_INFO(REPORTER, - CReporterRHticket, - "RHticket", - "0.0.4", - _("Reports bugs to Red Hat support"), - "Denys Vlasenko <dvlasenk@redhat.com>", - "https://fedorahosted.org/abrt/wiki", - PLUGINS_LIB_DIR"/RHTSupport.glade"); diff --git a/lib/plugins/RHTSupport.glade b/lib/plugins/RHTSupport.glade deleted file mode 100644 index 64fd6c26..00000000 --- a/lib/plugins/RHTSupport.glade +++ /dev/null @@ -1,213 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">12</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="lURL"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">RHTSupport URL:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lLogin"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Login:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="lPassword"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Password:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_URL"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Login"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Password"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="visibility">False</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="cb_Password"> - <property name="label" translatable="yes">Show password</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label3"> - <property name="xalign">0</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_SSLVerify"> - <property name="label" translatable="yes">SSL verify</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="xalign">0</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>RHTSupport plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="bApply"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">bApply</action-widget> - </action-widgets> - </object> - <object class="GtkAction" id="action1"/> -</interface> diff --git a/lib/plugins/RHTSupport.h b/lib/plugins/RHTSupport.h deleted file mode 100644 index 2338732f..00000000 --- a/lib/plugins/RHTSupport.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - Copyright (C) 2010 ABRT team - Copyright (C) 2010 RedHat Inc - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef RHTICKET_H_ -#define RHTICKET_H_ - -#include "plugin.h" -#include "reporter.h" - -class CReporterRHticket: public CReporter -{ - public: - CReporterRHticket(); - virtual ~CReporterRHticket(); - - virtual std::string Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs); - - virtual void SetSettings(const map_plugin_settings_t& pSettings); -}; - -#endif diff --git a/lib/plugins/ReportUploader.conf b/lib/plugins/ReportUploader.conf deleted file mode 100644 index 7a7b9133..00000000 --- a/lib/plugins/ReportUploader.conf +++ /dev/null @@ -1,23 +0,0 @@ -# Description: Packs crash data into .tar.gz file, optionally uploads it via FTP/SCP/etc - -Enabled = yes - -# Customer = "Example Inc." -# Ticket = IT12345 -# Encrypt = yes -# If set to "no" or commented out, -# compressed ticket data will be copied to /tmp: -# Upload = yes - -# If "Upload = yes", URL to upload the files to. -# supported: ftp, ftps, http, https, scp, sftp, tftp, file -# for example: ftp://user:password@server.name/directory -# or: scp://user:password@server.name:port/directory etc. -# for testing: file:///tmp/test_directory -# URL = - -# How many times we try to upload the file -# RetryCount = 3 - -# How long we wait between we retry the upload (in seconds) -# RetryDelay = 20 diff --git a/lib/plugins/ReportUploader.cpp b/lib/plugins/ReportUploader.cpp deleted file mode 100644 index 4100e996..00000000 --- a/lib/plugins/ReportUploader.cpp +++ /dev/null @@ -1,517 +0,0 @@ -/* - ReportUploader.cpp - - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include "abrtlib.h" -#include "abrt_curl.h" -#include "ReportUploader.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" - -using namespace std; - - -CReportUploader::CReportUploader() : - m_bEncrypt(false), - m_bUpload(false), - m_nRetryCount(3), - m_nRetryDelay(20) -{} - -CReportUploader::~CReportUploader() -{} - - -static void RunCommand(const char *cmd) -{ - int retcode = system(cmd); - if (retcode) - { - throw CABRTException(EXCEP_PLUGIN, "'%s' exited with %d", cmd, retcode); - } -} - -static string ReadCommand(const char *cmd) -{ - FILE* fp = popen(cmd, "r"); - if (!fp) - { - throw CABRTException(EXCEP_PLUGIN, "Error running '%s'", cmd); - } - - string result; - char *buff; - while ((buff = xmalloc_fgetline(fp)) != NULL) - { - result += buff; - free(buff); - } - - int retcode = pclose(fp); - if (retcode) - { - throw CABRTException(EXCEP_PLUGIN, "'%s' exited with %d", cmd, retcode); - } - - return result; -} - -static void WriteCommand(const char *cmd, const char *input) -{ - FILE* fp = popen(cmd, "w"); - if (!fp) - { - throw CABRTException(EXCEP_PLUGIN, "error running '%s'", cmd); - } - - /* Hoping it's not too big to get us forever blocked... */ - fputs(input, fp); - - int retcode = pclose(fp); - if (retcode) - { - throw CABRTException(EXCEP_PLUGIN, "'%s' exited with %d", cmd, retcode); - } -} - -void CReportUploader::SendFile(const char *pURL, const char *pFilename, int retry_count, int retry_delay) -{ - if (pURL[0] == '\0') - { - error_msg(_("FileTransfer: URL not specified")); - return; - } - - update_client(_("Sending archive %s to %s"), pFilename, pURL); - - const char *base = (strrchr(pFilename, '/') ? : pFilename-1) + 1; - char *whole_url = concat_path_file(pURL, base); - int count = retry_count; - int result; - while (1) - { - FILE* f = fopen(pFilename, "r"); - if (!f) - { - free(whole_url); - throw CABRTException(EXCEP_PLUGIN, "Can't open archive file '%s'", pFilename); - } - struct stat buf; - fstat(fileno(f), &buf); /* never fails */ - CURL* curl = xcurl_easy_init(); - /* enable uploading */ - curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); - /* specify target */ - curl_easy_setopt(curl, CURLOPT_URL, whole_url); - curl_easy_setopt(curl, CURLOPT_READDATA, f); - curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)buf.st_size); - /* everything is done here; result 0 means success */ - result = curl_easy_perform(curl); - /* goodbye */ - curl_easy_cleanup(curl); - fclose(f); - if (result != 0) - { - update_client(_("Sending failed, trying again. %s"), curl_easy_strerror((CURLcode)result)); - } - if (result == 0 || --count <= 0) - break; - /* retry the upload if not succesful, wait a bit before next try */ - sleep(retry_delay); - } - free(whole_url); - - if (count <= 0 && result != 0) - { - throw CABRTException(EXCEP_PLUGIN, "Curl can not send a ticket"); - } -} - - -static void write_str_to_file(const char *str, const char *path, const char *fname) -{ - char *ofile_name = concat_path_file(path, fname); - FILE *ofile = fopen(ofile_name, "w"); - if (!ofile) - { - CABRTException e(EXCEP_PLUGIN, "Can't open '%s'", ofile_name); - free(ofile_name); - throw e; - } - free(ofile_name); - fputs(str, ofile); - fclose(ofile); -} - -string CReportUploader::Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs) -{ - string customer_name; - string ticket_name; - string upload_url; - bool do_encrypt; - bool do_upload; - int retry_count; - int retry_delay; - - /* if parse_settings fails it returns an empty map so we need to use defaults */ - map_plugin_settings_t settings = parse_settings(pSettings); - // Get ticket name, customer name, and do_encrypt from config settings - if (!settings.empty()) - { - customer_name = settings["Customer"]; - ticket_name = settings["Ticket"]; - upload_url = settings["URL"]; - do_encrypt = string_to_bool(settings["Encrypt"].c_str()); - do_upload = string_to_bool(settings["Upload"].c_str()); - retry_count = xatoi_u(settings["RetryCount"].c_str()); - retry_delay = xatoi_u(settings["RetryDelay"].c_str()); - } - else - { - customer_name = m_sCustomer; - ticket_name = m_sTicket; - upload_url = m_sURL; - do_encrypt = m_bEncrypt; - do_upload = m_bUpload; - retry_count = m_nRetryCount; - retry_delay = m_nRetryDelay; - } - update_client(_("Creating a ReportUploader report...")); - - bool have_ticket_name = (ticket_name != ""); - if (!have_ticket_name) - { - ticket_name = "ReportUploader-newticket"; - } - - // Format the time to add to the file name - char timebuf[256]; - time_t curtime = time(NULL); - strftime(timebuf, sizeof(timebuf), "-%Y%m%d%H%M%S", gmtime(&curtime)); - - // Create a tmp work directory, and within that - // create the "<ticketname>-yyyymmddhhmmss" directory - // which will be the root of the tarball - string file_name = ticket_name + timebuf; - - char tmpdir_name[] = "/tmp/abrtuploadXXXXXX"; - if (mkdtemp(tmpdir_name) == NULL) - { - throw CABRTException(EXCEP_PLUGIN, "Can't mkdir a temporary directory in /tmp"); - } - - char *tmptar_name = concat_path_file(tmpdir_name, file_name.c_str()); - if (mkdir(tmptar_name, 0700)) - { - CABRTException e(EXCEP_PLUGIN, "Can't mkdir '%s'", tmptar_name); - free(tmptar_name); - throw e; - } - - // Copy each entry into the tarball root. - // Files are simply copied, strings are written to a file - // TODO: some files are totally useless: - // "Reported", "Message" (plugin's output), "DumpDir", - // "Description" (package description) - maybe skip those? - map_crash_data_t::const_iterator it; - for (it = pCrashData.begin(); it != pCrashData.end(); it++) - { - const char *content = it->second[CD_CONTENT].c_str(); - if (it->second[CD_TYPE] == CD_TXT) - { - write_str_to_file(content, tmptar_name, it->first.c_str()); - } - else if (it->second[CD_TYPE] == CD_BIN) - { - char *ofile_name = concat_path_file(tmptar_name, it->first.c_str()); - if (copy_file(content, ofile_name, 0644) < 0) - { - CABRTException e(EXCEP_PLUGIN, - "Can't copy '%s' to '%s'", - content, ofile_name - ); - free(tmptar_name); - free(ofile_name); - throw e; - } - free(ofile_name); - } - } - - // add ticket_name and customer name to tarball - if (have_ticket_name) - { - write_str_to_file(ticket_name.c_str(), tmptar_name, "TICKET"); - } - if (customer_name != "") - { - write_str_to_file(customer_name.c_str(), tmptar_name, "CUSTOMER"); - } - - // Create the compressed tarball - string outfile_basename = file_name + ".tar.gz"; - char *outfile_name = concat_path_file(tmpdir_name, outfile_basename.c_str()); - string cmd = ssprintf("tar -C %s --create --gzip --file=%s %s", tmpdir_name, outfile_name, file_name.c_str()); - RunCommand(cmd.c_str()); - - // encrypt if requested - string key; - if (do_encrypt) - { - key = ReadCommand("openssl rand -base64 48"); - - string infile_name = outfile_name; - outfile_basename += ".aes"; - outfile_name = append_to_malloced_string(outfile_name, ".aes"); - - cmd = ssprintf("openssl aes-128-cbc -in %s -out %s -pass stdin", infile_name.c_str(), outfile_name); - WriteCommand(cmd.c_str(), key.c_str()); - } - - // generate md5sum - cmd = ssprintf("cd %s; md5sum <%s", tmpdir_name, outfile_basename.c_str()); - string md5sum = ReadCommand(cmd.c_str()); - - // upload or cp to /tmp - if (do_upload) - { - // FIXME: SendFile isn't working sometime (scp) - SendFile(upload_url.c_str(), outfile_name, retry_count, retry_delay); - } - else - { - cmd = ssprintf("cp %s /tmp/", outfile_name); - RunCommand(cmd.c_str()); - } - - // generate a reciept telling md5sum and encryption key - // note: do not internationalize these strings! - string msg; - if (have_ticket_name) - { - msg += "Please copy this into ticket: "; - msg += ticket_name; - msg += '\n'; - msg += "========cut here========\n"; - } - else - { - msg += "Please send this to your technical support:\n"; - msg += "========cut here========\n"; - } - if (do_upload) - { - msg += "RHUPLOAD: This report was sent to "; - msg += upload_url; - msg += '\n'; - } - else - { - msg += "RHUPLOAD: This report was copied into /tmp/:\n"; - } - if (have_ticket_name) - { - msg += "TICKET: "; - msg += ticket_name; - msg += '\n'; - } - msg += "FILE: "; - msg += outfile_basename; - msg += "\nMD5SUM: "; - msg += md5sum; - msg += '\n'; - if (do_encrypt) - { - msg += "KEY: aes-128-cbc\n"; - msg += key; - msg += '\n'; - } - msg += "==========end===========\n"; - - // warn the client (why _warn_? it's not an error, maybe update_client?): - //error_msg("%s", msg.c_str()); - - // delete the temporary directory - cmd = ssprintf("rm -rf %s", tmpdir_name); - RunCommand(cmd.c_str()); - - free(tmptar_name); - free(outfile_name); - - return msg; -} - -static bool is_string_safe(const char *str) -{ - const char *p = str; - while (*p) - { - unsigned char c = *p; - if ((c < '0' || c > '9') - && c != '_' - && c != '-' - ) { - c |= 0x20; // tolower - if (c < 'a' || c > 'z') - { - return false; - } - } - // only 0-9, -, _, A-Z, a-z reach this point - p++; - } - return true; -} - -void CReportUploader::SetSettings(const map_plugin_settings_t& pSettings) -{ - m_pSettings = pSettings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - it = pSettings.find("Customer"); - if (it != end) - { - m_sCustomer = it->second; - } - // We use m_sTicket as part of filename, - // and we use resulting filename in system("cd %s; ...", filename) etc, - // so we are very paraniod about allowed chars - it = pSettings.find("Ticket"); - if (it != end && is_string_safe(it->second.c_str())) - { - m_sTicket = it->second; - } - it = pSettings.find("URL"); - if (it != end) - { - m_sURL = it->second; - } - it = pSettings.find("Encrypt"); - if (it != end) - { - m_bEncrypt = string_to_bool(it->second.c_str()); - } - it = pSettings.find("Upload"); - if (it != end) - { - m_bUpload = string_to_bool(it->second.c_str()); - } - it = pSettings.find("RetryCount"); - if (it != end) - { - m_nRetryCount = xatoi_u(it->second.c_str()); - } - it = pSettings.find("RetryDelay"); - if (it != end) - { - m_nRetryDelay = xatoi_u(it->second.c_str()); - } -} - -const map_plugin_settings_t& CReportUploader::GetSettings() -{ - m_pSettings["Customer"] = m_sCustomer; - m_pSettings["Ticket"] = m_sTicket; - m_pSettings["URL"] = m_sURL; - m_pSettings["Encrypt"] = m_bEncrypt ? "yes" : "no"; - m_pSettings["Upload"] = m_bUpload ? "yes" : "no"; - m_pSettings["RetryCount"] = to_string(m_nRetryCount); - m_pSettings["RetryDelay"] = to_string(m_nRetryDelay); - - return m_pSettings; -} - -//todo: make static -map_plugin_settings_t CReportUploader::parse_settings(const map_plugin_settings_t& pSettings) -{ - map_plugin_settings_t plugin_settings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - - it = pSettings.find("Customer"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["Customer"] = it->second; - - it = pSettings.find("Ticket"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["Ticket"] = it->second; - - it = pSettings.find("URL"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["URL"] = it->second; - - it = pSettings.find("Encrypt"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["Encrypt"] = it->second; - - it = pSettings.find("Upload"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["Upload"] = it->second; - - it = pSettings.find("RetryCount"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["RetryCount"] = it->second; - - it = pSettings.find("RetryDelay"); - if (it == end) - { - plugin_settings.clear(); - return plugin_settings; - } - plugin_settings["RetryDelay"] = it->second; - - VERB1 log("User settings ok, using them instead of defaults"); - return plugin_settings; -} - -PLUGIN_INFO(REPORTER, - CReportUploader, - "ReportUploader", - "0.0.1", - _("Packs crash data into .tar.gz file, optionally uploads it via FTP/SCP/etc"), - "gavin@redhat.com", - "https://fedorahosted.org/abrt/wiki", - PLUGINS_LIB_DIR"/ReportUploader.glade"); diff --git a/lib/plugins/ReportUploader.glade b/lib/plugins/ReportUploader.glade deleted file mode 100644 index c2bbd470..00000000 --- a/lib/plugins/ReportUploader.glade +++ /dev/null @@ -1,249 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.14"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkDialog" id="PluginDialog"> - <property name="border_width">5</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="icon_name">abrt</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">2</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="top_padding">6</property> - <property name="left_padding">12</property> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">7</property> - <property name="n_columns">2</property> - <property name="column_spacing">12</property> - <property name="row_spacing">6</property> - <child> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Customer:</property> - </object> - <packing> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Ticket:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">URL:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Customer"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_Ticket"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_URL"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label6"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Retry count:</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_RetryCount"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Retry delay:</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="conf_RetryDelay"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_Encrypt"> - <property name="label" translatable="yes">Use encryption</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="conf_Upload"> - <property name="label" translatable="yes">Upload</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Report Uploader plugin configuration</b></property> - <property name="use_markup">True</property> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="button2"> - <property name="label">gtk-cancel</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="bApply"> - <property name="label">gtk-apply</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">button2</action-widget> - <action-widget response="-10">bApply</action-widget> - </action-widgets> - </object> - <object class="GtkAction" id="action1"/> -</interface> diff --git a/lib/plugins/ReportUploader.h b/lib/plugins/ReportUploader.h deleted file mode 100644 index 4ff780b8..00000000 --- a/lib/plugins/ReportUploader.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ReportUploader.h - - Attach a configureable Ticket Number and Customer name to a report. - Create a compressed, optionally encrypted, tarball. - Upload tarball to configureable URL. - - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef REPORTUPLOADER_H_ -#define REPORTUPLAODER_H_ - -#include "plugin.h" -#include "reporter.h" - -class CReportUploader : public CReporter -{ - private: - std::string m_sCustomer; - std::string m_sTicket; - std::string m_sURL; - bool m_bEncrypt; - bool m_bUpload; - int m_nRetryCount; - int m_nRetryDelay; - - void SendFile(const char *pURL, const char *pFilename, int retry_count, int retry_delay); - map_plugin_settings_t parse_settings(const map_plugin_settings_t& pSettings); - - public: - CReportUploader(); - virtual ~CReportUploader(); - virtual const map_plugin_settings_t& GetSettings(); - virtual void SetSettings(const map_plugin_settings_t& pSettings); - - virtual std::string Report(const map_crash_data_t& pCrashData, - const map_plugin_settings_t& pSettings, - const char *pArgs); -}; - -#endif diff --git a/lib/plugins/SOSreport.conf b/lib/plugins/SOSreport.conf deleted file mode 100644 index 3201c6da..00000000 --- a/lib/plugins/SOSreport.conf +++ /dev/null @@ -1 +0,0 @@ -Enabled = yes diff --git a/lib/plugins/SOSreport.cpp b/lib/plugins/SOSreport.cpp deleted file mode 100644 index 36a768fd..00000000 --- a/lib/plugins/SOSreport.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - SOSreport.cpp - - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include "abrtlib.h" -#include "abrt_exception.h" -#include "SOSreport.h" -#include "abrt_exception.h" -#include "comm_layer_inner.h" - -using namespace std; - -static char *ParseFilename(char *p) -{ - /* - the sosreport's filename is embedded in sosreport's output. - It appears on the line after the string in 'sosreport_filename_marker', - it has leading spaces, and a trailing newline. This function trims - any leading and trailing whitespace from the filename. - */ - static const char sosreport_filename_marker[] = - "Your sosreport has been generated and saved in:"; - - p = strstr(p, sosreport_filename_marker); - if (!p) - return p; - p = skip_whitespace(p + sizeof(sosreport_filename_marker)-1); - char *end = strchrnul(p, '\n'); - while (end > p && isspace(*end)) - *end-- = '\0'; - return p[0] == '/' ? p : NULL; -} - -void CActionSOSreport::Run(const char *pActionDir, const char *pArgs, int force) -{ - if (!force) - { - struct dump_dir *dd = dd_opendir(pActionDir, /*flags:*/ 0); - if (!dd) - return; - - bool bt_exists = dd_exist(dd, "sosreport.tar.bz2") || dd_exist(dd, "sosreport.tar.xz"); - if (bt_exists) - { - VERB3 log("%s already exists, not regenerating", "sosreport.tar.bz2"); - return; - } - dd_close(dd); - } - - static const char command_default[] = - "cd -- '%s' || exit 1;" - "nice sosreport --tmp-dir . --batch" - " --only=anaconda --only=bootloader" - " --only=devicemapper --only=filesys --only=hardware --only=kernel" - " --only=libraries --only=memory --only=networking --only=nfsserver" - " --only=pam --only=process --only=rpm -k rpm.rpmva=off --only=ssh" - " --only=startup --only=yum 2>&1;" - "rm sosreport*.md5 2>/dev/null;" - "mv sosreport*.tar.bz2 sosreport.tar.bz2 2>/dev/null;" - "mv sosreport*.tar.xz sosreport.tar.xz 2>/dev/null;" - ; - static const char command_prefix[] = - "cd -- '%s' || exit 1;" - "nice sosreport --tmp-dir . --batch %s 2>&1;" - "rm sosreport*.md5 2>/dev/null;" - "mv sosreport*.tar.bz2 sosreport.tar.bz2 2>/dev/null;" - "mv sosreport*.tar.xz sosreport.tar.xz 2>/dev/null;" - ; - string command; - - vector_string_t args; - parse_args(pArgs, args, '"'); - - if (args.size() == 0 || args[0] == "") - { - command = ssprintf(command_default, pActionDir); - } - else - { - command = ssprintf(command_prefix, pActionDir, args[0].c_str()); - } - - update_client(_("Running sosreport: %s"), command.c_str()); - string output = command; - output += '\n'; - char *command_out = run_in_shell_and_save_output(/*flags:*/ 0, command.c_str(), /*dir:*/ NULL, /*size_p:*/ NULL); - output += command_out; - update_client(_("Finished running sosreport")); - VERB3 log("sosreport output:'%s'", output.c_str()); - -// Not needed: now we use "sosreport --tmp-dir DUMPDIR" -#if 0 - // Parse: - // "Your sosreport has been generated and saved in: - // /tmp/sosreport-XXXX.tar.bz2" - // Note: ParseFilename modifies its parameter and returns pointer - // which points somewhere inside it. - char *sosreport_filename = xstrdup(ParseFilename(command_out)); - free(command_out); - if (!sosreport_filename) - { - throw CABRTException(EXCEP_PLUGIN, "Can't find filename in sosreport output"); - } - - char *sosreport_dd_filename = concat_path_file(pActionDir, "sosreport.tar"); - char *ext = strrchr(sosreport_filename, '.'); - if (ext && strcmp(ext, ".tar") != 0) - { - // Assuming it's .bz2, .gz or some such - sosreport_dd_filename = append_to_malloced_string(sosreport_dd_filename, ext); - } - - CDebugDump dd; - if (!dd.Open(pActionDir)) - { - VERB1 log(_("Unable to open debug dump '%s'"), pDebugDumpDir); - free(sosreport_filename); - free(sosreport_dd_filename); - return; - } - //Not useful: dd.SaveText("sosreportoutput", output); - off_t sz = copy_file(sosreport_filename, sosreport_dd_filename, 0644); - - // don't want to leave sosreport-XXXX.tar.bz2 in /tmp - unlink(sosreport_filename); - // sosreport-XXXX.tar.bz2.md5 too - sosreport_filename = append_to_malloced_string(sosreport_filename, ".md5"); - unlink(sosreport_filename); - - dd.Close(); - if (sz < 0) - { - CABRTException e(EXCEP_PLUGIN, - "Can't copy '%s' to '%s'", - sosreport_filename, sosreport_dd_filename - ); - free(sosreport_filename); - free(sosreport_dd_filename); - throw e; - } - free(sosreport_filename); - free(sosreport_dd_filename); -#endif -} - -PLUGIN_INFO(ACTION, - CActionSOSreport, - "SOSreport", - "0.0.2", - _("Runs sosreport, saves the output"), - "gavin@redhat.com", - "https://fedorahosted.org/abrt/wiki", - ""); diff --git a/lib/plugins/SOSreport.h b/lib/plugins/SOSreport.h deleted file mode 100644 index 4b32940f..00000000 --- a/lib/plugins/SOSreport.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - SOSreport.h - Attach an sosreport to a crash dump - - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef SOSREPORT_H_ -#define SOSREPORT_H_ - -#include "action.h" - -class CActionSOSreport : public CAction -{ - public: - virtual void Run(const char *pActionDir, const char *pArgs, int force); -}; - -#endif diff --git a/lib/plugins/SQLite3.conf b/lib/plugins/SQLite3.conf deleted file mode 100644 index a7617a90..00000000 --- a/lib/plugins/SQLite3.conf +++ /dev/null @@ -1,4 +0,0 @@ -# Configuration file for database plugin SQLite3 - -# DB path -DBPath = /var/spool/abrt/abrt-db diff --git a/lib/plugins/SQLite3.cpp b/lib/plugins/SQLite3.cpp deleted file mode 100644 index 2ed3f9fd..00000000 --- a/lib/plugins/SQLite3.cpp +++ /dev/null @@ -1,742 +0,0 @@ -/* - SQLite3.cpp - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include <sqlite3.h> -#include "abrtlib.h" -#include "SQLite3.h" - -using namespace std; - -#define ABRT_TABLE_VERSION 4 -#define ABRT_TABLE_VERSION_STR "4" -#define ABRT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR -#define ABRT_REPRESULT_TABLE "abrt_v"ABRT_TABLE_VERSION_STR"_reportresult" -#define SQLITE3_MASTER_TABLE "sqlite_master" - -#define COL_UID "UID" -#define COL_UUID "UUID" -#define COL_INFORMALL "InformAll" -#define COL_DEBUG_DUMP_PATH "DebugDumpPath" -#define COL_COUNT "Count" -#define COL_REPORTED "Reported" -#define COL_TIME "Time" -#define COL_MESSAGE "Message" - -#define COL_REPORTER "Reporter" - -#define NUM_COL 8 - -/* Is this string safe wrt SQL injection? - * PHP's mysql_real_escape_string() treats \, ', ", \x00, \n, \r, and \x1a as special. - * We are a bit more paranoid and disallow any control chars. - */ -static bool is_string_safe(const char *str) -{ -// Apparently SQLite allows unescaped newlines. More surprisingly, -// it does not unescape escaped ones - I see lines ending with \ when I do it. -// I wonder whether this is a bug in SQLite, and whether using unescaped -// newlines is a danger with other SQL servers. -// For now, I disabled newline escaping, and also allowed double quote. - const char *p = str; - while (*p) - { - unsigned char c = *p; -// if (c == '\\' && p[1] != '\0') -// { -// p += 2; -// continue; -// } - if ((c < ' ' && c != '\n') - || strchr("\\\'", c) //was: "\\\"\'" - ) { - error_msg("Probable SQL injection: '%s'", str); - return false; - } - p++; - } - return true; -} - -#ifdef UNUSED_FOR_NOW -/* Escape \n */ -static string sql_escape(const char *str) -{ - const char *s = str; - unsigned len = 0; - do - { - if (*s == '\n') - len++; - len++; - } while (*s++); - - char buf[len]; - s = str; - char *d = buf; - do - { - if (*s == '\n') - *d++ = '\\'; - *d++ = *s; - } while (*s++); - - return buf; -} -#endif - -/* Note: - * expects "SELECT * FROM ...", not "SELECT <only some fields> FROM ..." - */ -static GList *vget_table(sqlite3 *db, const char *fmt, va_list p) -{ - char *sql = xvasprintf(fmt, p); - - char **table; - int ncol, nrow; - char *err = NULL; - int ret = sqlite3_get_table(db, sql, &table, &nrow, &ncol, &err); - if (ret != SQLITE_OK) - { - error_msg("Error in SQL:'%s' error: %s", sql, err); - free(sql); - sqlite3_free(err); - return (GList*)ERR_PTR; - } - VERB2 log("%s: %d rows returned by SQL:%s", __func__, nrow, sql); - free(sql); - - if (nrow > 0 && ncol < NUM_COL) - error_msg_and_die("Unexpected number of columns: %d", ncol); - - GList *rows = NULL; - int ii; - for (ii = 0; ii < nrow; ii++) - { - int jj; - struct db_row *row = (struct db_row*)xzalloc(sizeof(struct db_row)); - for (jj = 0; jj < ncol; jj++) - { - char *val = table[jj + (ncol*ii) + ncol]; - switch (jj) - { - case 0: row->db_uuid = xstrdup(val); break; - case 1: row->db_uid = xstrdup(val); break; - case 2: row->db_inform_all = xstrdup(val); break; - case 3: row->db_dump_dir = xstrdup(val); break; - case 4: row->db_count = xstrdup(val); break; - case 5: row->db_reported = xstrdup(val); break; - case 6: row->db_time = xstrdup(val); break; - case 7: row->db_message = xstrdup(val); break; - } - } - - VERB3 log("%s: row->db_uuid = '%s'", __func__, row->db_uuid); - VERB3 log("%s: row->db_uid = '%s'", __func__, row->db_uid); - VERB3 log("%s: row->db_inform_all = '%s'", __func__, row->db_inform_all); - VERB3 log("%s: row->db_dump_dir = '%s'", __func__, row->db_dump_dir); - VERB3 log("%s: row->db_count = '%s'", __func__, row->db_count); - VERB3 log("%s: row->db_reported = '%s'", __func__, row->db_reported); - VERB3 log("%s: row->db_time = '%s'", __func__, row->db_time); - VERB3 log("%s: row->db_message = '%s'", __func__, row->db_message); - rows = g_list_append(rows, row); - - } - sqlite3_free_table(table); - - return rows; -} - -static GList *get_table_or_die(sqlite3 *db, const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - GList *table = vget_table(db, fmt, p); - va_end(p); - - if (table == (GList*)ERR_PTR) - xfunc_die(); - - return table; -} - -static int vexecute_sql(sqlite3 *db, const char *fmt, va_list p) -{ - char *sql = xvasprintf(fmt, p); - - char *err = NULL; - int ret = sqlite3_exec(db, sql, /*callback:*/ NULL, /*callback param:*/ NULL, &err); - if (ret != SQLITE_OK) - { - error_msg("Error in SQL:'%s' error: %s", sql, err); - free(sql); - sqlite3_free(err); - return -1; - } - int affected = sqlite3_changes(db); - VERB2 log("%d rows affected by SQL:%s", affected, sql); - free(sql); - - return affected; -} - -static int execute_sql_or_die(sqlite3 *db, const char *fmt, ...) -{ - va_list p; - va_start(p, fmt); - int ret = vexecute_sql(db, fmt, p); - va_end(p); - - if (ret < 0) - xfunc_die(); - - return ret; -} - -static bool exists_uuid_uid(sqlite3 *db, const char *UUID, const char *UID) -{ - GList *table = get_table_or_die(db, "SELECT * FROM "ABRT_TABLE - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - UUID, UID - ); - - if (!table) - return false; - - db_list_free(table); - - return true; -} - -static void update_from_old_ver(sqlite3 *db, int old_version) -{ - static const char *const update_sql_commands[] = { - // v0 -> v1 - NULL, - // v1 -> v2 - "BEGIN TRANSACTION;" - "CREATE TABLE abrt_v2 (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - COL_COUNT" INT NOT NULL DEFAULT 1," - COL_REPORTED" INT NOT NULL DEFAULT 0," - COL_TIME" VARCHAR NOT NULL DEFAULT 0," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID"));" - "INSERT INTO abrt_v2 " - "SELECT "COL_UUID"," - COL_UID"," - COL_DEBUG_DUMP_PATH"," - COL_COUNT"," - COL_REPORTED"," - COL_TIME"," - COL_MESSAGE - " FROM abrt;" - "DROP TABLE abrt;" - "COMMIT;", - // v2 -> v3 - "BEGIN TRANSACTION;" - "CREATE TABLE abrt_v3 (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - COL_COUNT" INT NOT NULL DEFAULT 1," - COL_REPORTED" INT NOT NULL DEFAULT 0," - COL_TIME" VARCHAR NOT NULL DEFAULT 0," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID"));" - "INSERT INTO abrt_v3 " - "SELECT "COL_UUID"," - COL_UID"," - COL_DEBUG_DUMP_PATH"," - COL_COUNT"," - COL_REPORTED"," - COL_TIME"," - COL_MESSAGE - " FROM abrt_v2;" - "DROP TABLE abrt_v2;" - "CREATE TABLE abrt_v3_reportresult (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_REPORTER" VARCHAR NOT NULL," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID","COL_REPORTER"));" - "COMMIT;", - // v3-> v4 - "BEGIN TRANSACTION;" - "CREATE TABLE abrt_v4(" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_INFORMALL" INT NOT NULL DEFAULT 0," - COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - COL_COUNT" INT NOT NULL DEFAULT 1," - COL_REPORTED" INT NOT NULL DEFAULT 0," - COL_TIME" VARCHAR NOT NULL DEFAULT 0," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID"));" - "INSERT INTO abrt_v4 " - "SELECT "COL_UUID"," - COL_UID"," - "0," /* COL_INFORMALL */ - COL_DEBUG_DUMP_PATH"," - COL_COUNT"," - COL_REPORTED"," - COL_TIME"," - COL_MESSAGE - " FROM abrt_v3;" - "DROP TABLE abrt_v3;" - "UPDATE abrt_v4" - " SET "COL_UID"='0', "COL_INFORMALL"=1" - " WHERE "COL_UID"='-1';" - "CREATE TABLE abrt_v4_reportresult (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_REPORTER" VARCHAR NOT NULL," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID","COL_REPORTER"));" - "INSERT INTO abrt_v4_reportresult " - "SELECT * FROM abrt_v3_reportresult;" - "DROP TABLE abrt_v3_reportresult;" - "COMMIT;", - }; - - while (old_version < ABRT_TABLE_VERSION) - { - execute_sql_or_die(db, update_sql_commands[old_version]); - old_version++; - } -} - -static bool check_table(sqlite3 *db) -{ - const char *command = "SELECT NAME FROM "SQLITE3_MASTER_TABLE" " - "WHERE TYPE='table' AND NAME like 'abrt_v%';"; - char **table; - int ncol, nrow; - char *err; - int ret = sqlite3_get_table(db, command, &table, &nrow, &ncol, &err); - if (ret != SQLITE_OK) - { - /* Should never happen */ - error_msg_and_die("SQLite3 database is corrupted"); - } - if (!nrow) - { - sqlite3_free_table(table); - return false; - } - - // table format: - // table[0]:"NAME" // table[1]:"SQL" <== field names from SELECT - // table[2]:"abrt_vNN" // table[3]:"sql" - char *tableName = table[0 + ncol]; - char *underscore = strchr(tableName, '_'); - if (underscore) - { - // It can be "abrt_vNN_something", thus using atoi(), not xatoi() - int tableVersion = atoi(underscore + 2); - sqlite3_free_table(table); - if (tableVersion < ABRT_TABLE_VERSION) - { - update_from_old_ver(db, tableVersion); - } - return true; - } - sqlite3_free_table(table); - update_from_old_ver(db, 1); - return true; -} - - -CSQLite3::CSQLite3() : - m_sDBPath(LOCALSTATEDIR "/spool/abrt/abrt-db"), - m_pDB(NULL) -{} - -CSQLite3::~CSQLite3() -{ - /* Paranoia. In C++, destructor will abort() if it was called while unwinding - * the stack and it throws an exception. - */ - try - { - DisConnect(); - m_sDBPath.clear(); - } - catch (...) - { - error_msg_and_die("Internal error"); - } -} - -void CSQLite3::DisConnect() -{ - if (m_pDB) - { - sqlite3_close(m_pDB); - m_pDB = NULL; - } -} - -void CSQLite3::Connect() -{ - int ret = sqlite3_open_v2(m_sDBPath.c_str(), - &m_pDB, - SQLITE_OPEN_READWRITE, - NULL - ); - - if (ret != SQLITE_OK) - { - if (ret != SQLITE_CANTOPEN) - { - error_msg_and_die("Can't open database '%s': %s", m_sDBPath.c_str(), sqlite3_errmsg(m_pDB)); - } - - ret = sqlite3_open_v2(m_sDBPath.c_str(), - &m_pDB, - SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, - NULL - ); - if (ret != SQLITE_OK) - { - error_msg_and_die("Can't create database '%s': %s", m_sDBPath.c_str(), sqlite3_errmsg(m_pDB)); - } - } - - if (!check_table(m_pDB)) - { - execute_sql_or_die(m_pDB, - "CREATE TABLE "ABRT_TABLE" (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_INFORMALL" INT NOT NULL DEFAULT 0," - COL_DEBUG_DUMP_PATH" VARCHAR NOT NULL," - COL_COUNT" INT NOT NULL DEFAULT 1," - COL_REPORTED" INT NOT NULL DEFAULT 0," - COL_TIME" VARCHAR NOT NULL DEFAULT 0," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID"));" - ); - execute_sql_or_die(m_pDB, - "CREATE TABLE "ABRT_REPRESULT_TABLE" (" - COL_UUID" VARCHAR NOT NULL," - COL_UID" VARCHAR NOT NULL," - COL_REPORTER" VARCHAR NOT NULL," - COL_MESSAGE" VARCHAR NOT NULL DEFAULT ''," - "PRIMARY KEY ("COL_UUID","COL_UID","COL_REPORTER"));" - ); - } -} - -void CSQLite3::Insert_or_Update(const char *crash_id, - bool inform_all_users, - const char *pDebugDumpPath, - const char *pTime) -{ - const char *UUID = strchr(crash_id, ':'); - if (!UUID - || !is_string_safe(crash_id) - || !is_string_safe(pDebugDumpPath) - || !is_string_safe(pTime) - ) { - return; - } - - /* Split crash_id into UID:UUID */ - unsigned uid_len = UUID - crash_id; - UUID++; - char UID[uid_len + 1]; - strncpy(UID, crash_id, uid_len); - UID[uid_len] = '\0'; - - if (!exists_uuid_uid(m_pDB, UUID, UID)) - { - execute_sql_or_die(m_pDB, - "INSERT INTO "ABRT_TABLE" (" - COL_UUID"," - COL_UID"," - COL_INFORMALL"," - COL_DEBUG_DUMP_PATH"," - COL_TIME - ")" - " VALUES ('%s','%s',%u,'%s','%s');", - UUID, UID, (unsigned)inform_all_users, pDebugDumpPath, pTime - ); - } - else - { - execute_sql_or_die(m_pDB, - "UPDATE "ABRT_TABLE - " SET "COL_COUNT"="COL_COUNT"+1,"COL_TIME"='%s'" - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - pTime, - UUID, UID - ); - } -} - -void CSQLite3::DeleteRow(const char *crash_id) -{ - const char *UUID = strchr(crash_id, ':'); - if (!UUID - || !is_string_safe(crash_id) - ) { - return; - } - - /* Split crash_id into UID:UUID */ - unsigned uid_len = UUID - crash_id; - UUID++; - char UID[uid_len + 1]; - strncpy(UID, crash_id, uid_len); - UID[uid_len] = '\0'; - - if (exists_uuid_uid(m_pDB, UUID, UID)) - { - execute_sql_or_die(m_pDB, "DELETE FROM "ABRT_TABLE - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - UUID, UID - ); - execute_sql_or_die(m_pDB, "DELETE FROM "ABRT_REPRESULT_TABLE - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - UUID, UID - ); - } - else - { - error_msg("crash_id %s is not found in DB", crash_id); - } -} - -void CSQLite3::DeleteRows_by_dir(const char *dump_dir) -{ - if (!is_string_safe(dump_dir)) - { - return; - } - - /* Get UID:UUID pair(s) to delete */ - GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE - " WHERE "COL_DEBUG_DUMP_PATH"='%s';", - dump_dir - ); - - if (!table) - { - return; - } - - struct db_row *row = NULL; - /* Delete from both tables */ - for (GList *li = table; li != NULL; li = g_list_next(li)) - { - row = (struct db_row*)li->data; - execute_sql_or_die(m_pDB, - "DELETE FROM "ABRT_REPRESULT_TABLE - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - row->db_uuid, row->db_uid - ); - } - execute_sql_or_die(m_pDB, - "DELETE FROM "ABRT_TABLE - " WHERE "COL_DEBUG_DUMP_PATH"='%s'", - dump_dir - ); -} - -void CSQLite3::SetReported(const char *crash_id, const char *pMessage) -{ - const char *UUID = strchr(crash_id, ':'); - if (!UUID - || !is_string_safe(crash_id) - || !is_string_safe(pMessage) - ) { - return; - } - - /* Split crash_id into UID:UUID */ - unsigned uid_len = UUID - crash_id; - UUID++; - char UID[uid_len + 1]; - strncpy(UID, crash_id, uid_len); - UID[uid_len] = '\0'; - - if (exists_uuid_uid(m_pDB, UUID, UID)) - { - execute_sql_or_die(m_pDB, - "UPDATE "ABRT_TABLE - " SET "COL_REPORTED"=1" - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - UUID, UID - ); - execute_sql_or_die(m_pDB, - "UPDATE "ABRT_TABLE - " SET "COL_MESSAGE"='%s'" - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - pMessage, UUID, UID - ); - } - else - { - error_msg("crash_id %s is not found in DB", crash_id); - } -} - -void CSQLite3::SetReportedPerReporter(const char *crash_id, - const char *reporter, - const char *pMessage) -{ - const char *UUID = strchr(crash_id, ':'); - if (!UUID - || !is_string_safe(crash_id) - || !is_string_safe(reporter) - || !is_string_safe(pMessage) - ) { - return; - } - - /* Split crash_id into UID:UUID */ - unsigned uid_len = UUID - crash_id; - UUID++; - char UID[uid_len + 1]; - strncpy(UID, crash_id, uid_len); - UID[uid_len] = '\0'; - - int affected_rows = execute_sql_or_die(m_pDB, - "UPDATE "ABRT_REPRESULT_TABLE - " SET "COL_MESSAGE"='%s'" - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s' AND "COL_REPORTER"='%s'", - pMessage, - UUID, UID, reporter - ); - if (!affected_rows) - { - execute_sql_or_die(m_pDB, - "INSERT INTO "ABRT_REPRESULT_TABLE - " ("COL_UUID","COL_UID","COL_REPORTER","COL_MESSAGE")" - " VALUES ('%s','%s','%s','%s');", - UUID, UID, reporter, pMessage - ); - } -} - -GList *CSQLite3::GetUIDData(long caller_uid) -{ - GList *table = NULL; - - if (caller_uid == 0) - { - table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE";"); - } - else - { - table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE - " WHERE "COL_UID"='%ld' OR "COL_INFORMALL"=1;", - caller_uid - ); - } - return table; -} - -struct db_row *CSQLite3::GetRow(const char *crash_id) -{ - const char *UUID = strchr(crash_id, ':'); - if (!UUID - || !is_string_safe(crash_id) - ) { - return NULL; - } - - /* Split crash_id into UID:UUID */ - unsigned uid_len = UUID - crash_id; - UUID++; - char UID[uid_len + 1]; - strncpy(UID, crash_id, uid_len); - UID[uid_len] = '\0'; - - GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE - " WHERE "COL_UUID"='%s' AND "COL_UID"='%s';", - UUID, UID - ); - - if (!table) - { - return NULL; - } - - GList *first = g_list_first(table); - struct db_row *row = db_rowcpy_from_list(first); - - db_list_free(table); - - return row; -} - -struct db_row *CSQLite3::GetRow_by_dir(const char *dir) -{ - if (!is_string_safe(dir)) - return NULL; - - GList *table = get_table_or_die(m_pDB, "SELECT * FROM "ABRT_TABLE - " WHERE "COL_DEBUG_DUMP_PATH"='%s';", - dir - ); - - if (!table) - return NULL; - - GList *first = g_list_first(table); - struct db_row *row = db_rowcpy_from_list(first); - - db_list_free(table); - - return row; -} - -void CSQLite3::SetSettings(const map_plugin_settings_t& pSettings) -{ - m_pSettings = pSettings; - - map_plugin_settings_t::const_iterator end = pSettings.end(); - map_plugin_settings_t::const_iterator it; - it = pSettings.find("DBPath"); - if (it != end) - { - m_sDBPath = it->second; - } -} - -//ok to delete? -//const map_plugin_settings_t& CSQLite3::GetSettings() -//{ -// m_pSettings["DBPath"] = m_sDBPath; -// -// return m_pSettings; -//} - -PLUGIN_INFO(DATABASE, - CSQLite3, - "SQLite3", - "0.0.2", - _("Keeps SQLite3 database about all crashes"), - "zprikryl@redhat.com,jmoskovc@redhat.com", - "https://fedorahosted.org/abrt/wiki", - ""); diff --git a/lib/plugins/SQLite3.h b/lib/plugins/SQLite3.h deleted file mode 100644 index 5750d92e..00000000 --- a/lib/plugins/SQLite3.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - SQLite3.h - - Copyright (C) 2009 Zdenek Prikryl (zprikryl@redhat.com) - Copyright (C) 2009 RedHat inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef SQLITE3_H_ -#define SQLITE3_H_ - -#include "plugin.h" -#include "database.h" - -class CSQLite3 : public CDatabase -{ - private: - std::string m_sDBPath; - sqlite3* m_pDB; - - public: - CSQLite3(); - ~CSQLite3(); - - virtual void Connect(); - virtual void DisConnect(); - - virtual void Insert_or_Update(const char *crash_id, - bool inform_all_users, - const char *pDebugDumpPath, - const char *pTime); - virtual void DeleteRow(const char *crash_id); - virtual void DeleteRows_by_dir(const char *dump_dir); - virtual void SetReported(const char *crash_id, const char *pMessage); - virtual void SetReportedPerReporter(const char *crash_id, - const char *reporter, - const char *pMessage); - virtual GList *GetUIDData(long caller_uid); - virtual struct db_row *GetRow(const char *crash_id); - virtual struct db_row *GetRow_by_dir(const char *dir); - - virtual void SetSettings(const map_plugin_settings_t& pSettings); -}; - - -#endif diff --git a/lib/plugins/abrt-Bugzilla.7 b/lib/plugins/abrt-Bugzilla.7 deleted file mode 100644 index 99bb60d1..00000000 --- a/lib/plugins/abrt-Bugzilla.7 +++ /dev/null @@ -1,43 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -Bugzilla plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fIBugzilla\fP plugin -for \fIabrt\fP. -.P -This plugin is used to report the crash to a Bugzilla instance. The -plugin will determine the package name and distribution version. The -crash data is attached to the bug report. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. -No parameters are necessary. -.SH CONFIGURATION -The \fIBugzilla.conf\fP configuration file contains several -entries in the format "Option = Value". The options are: -.SS BugzillaURL -The URL of the Bugzilla instance that you want to use, including the -path to the xmlrpc. The default is https://bugzilla.redhat.com/xmlrpc.cgi -.SS Login -Your Bugzilla login. If you have no Bugzilla account, you cannot -use the plugin. -.SS Password -Your Bugzilla password. -.SH EXAMPLES -.P -This is a snippet from the \fIabrt.conf\fP configuration file. -When something crashes, use the Bugzilla plugin: -.P -[common] -.br -ActionsAndReporters = Bugzilla -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Zdenek Prikryl <zprikryl@redhat.com>. -Manual page written by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-FileTransfer.7 b/lib/plugins/abrt-FileTransfer.7 deleted file mode 100644 index a721dd81..00000000 --- a/lib/plugins/abrt-FileTransfer.7 +++ /dev/null @@ -1,72 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -FileTransfer plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fIFileTransfer\fP plugin -for \fIabrt\fP. -.P -This plugin is used to transfer the crash report to another -machine using a file transfer protocol. The protocols supported -are FTP, FTPS, HTTP, HTTPS, SCP, SFTP, and TFTP. -.SH INVOCATION -.P -The plugin is invoked in the \fIabrt.conf\fP file, usually in the -\fIActionsAndReporters\fP option and/or the \fI[cron]\fP section. -There are two modes of invocation: -.P -* Specify \fIFileTransfer(one)\fP in ActionsAndReporters directive. -Immediately after crash is detected, the plugin transfers crash data -to the server specified in the \fIFileTransfer.conf\fP configuration file. -.P -* Specify \fIFileTransfer(store)\fP in ActionsAndReporters directive -and add \fIHH:MM = FileTransfer\fP line in [cron] section. -At the time of the crash, -the plugin stores a record of it in its internal list. -When specified time is reached, the plugin iterates through -its internal list and sends every recorded crash to the specified URL. -After that, the internal list is cleared. -.SH CONFIGURATION -The \fIFileTransfer.conf\fP configuration file contains -several entries in the format "Option = Value". The options are: -.SS URL -The URL of the server, where the crash should -be transfered, specifying the protocol, the path, -the user name and the password, for example: -.br -URL = ftp://user:passwd@server.com/path -.SS ArchiveType -The type of the archive in which to pack the crash data. -Currently, \fI.tar\fP, \fI.tar.gz\fP, \fI.tar.bz2\fP and \fI.zip\fP -are supported. The default is \fI.tar.gz\fP -.SS RetryCount -This specifies how many times the plugin will try to resend -the file if the transfer was not succesful. The plugin -waits a while before it retries the transfer: see \fIRetryDelay\fP. -The default is 3 -.SS RetryDelay -If the transfer was not succesful, the plugin will -wait some time before sending the file again. This configuration -option specifies the time in seconds. The default is 20. -.SH EXAMPLES -.P -Typical configuration in \fIabrt.conf\fP. The crash is stored -each time it happens and at midnight, all the crash data -is transferred to a central server. -.P -[common] -.br -ActionsAndReporters = FileTransfer(store) -.br -[cron] -.br -00:00 = FileTransfer -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-KerneloopsReporter.7 b/lib/plugins/abrt-KerneloopsReporter.7 deleted file mode 100644 index 98bd3874..00000000 --- a/lib/plugins/abrt-KerneloopsReporter.7 +++ /dev/null @@ -1,40 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -KerneloopsReporter plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fIKerneloopsReporter\fP -plugin for \fIabrt\fP. -.P -This plugin is used to report the crash to the Kerneloops tracker. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. -No parameters are necessary. -.SH CONFIGURATION -The \fIKerneloopsReporter.conf\fP configuration file contains one entry: -.SS SubmitURL -The URL of the kerneloops tracker, the default is -.br -SubmitURL = http://submit.kerneloops.org/submitoops.php -.SH EXAMPLES -.P -This is a snippet from the \fIabrt.conf\fP configuration file. -Each time a kernel oops is detected, run KerneloopsReporter: -.P -[common] -.br -ActionsAndReporters = Kerneloops, KerneloopsReporter -.br -[AnalyzerActionsAndReporters] -.br -Kerneloops = KerneloopsReporter -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Anton Arapov <anton@redhat.com>. Manual -page by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-KerneloopsScanner.7 b/lib/plugins/abrt-KerneloopsScanner.7 deleted file mode 100644 index ff094847..00000000 --- a/lib/plugins/abrt-KerneloopsScanner.7 +++ /dev/null @@ -1,46 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -KerneloopsScanner plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fIKerneloopsScanner\fP -plugin for \fIabrt\fP. -.P -This plugin reads the system log file (default /var/log/messages) -and stores the kernel oops crashes, which were not already -reported, to abrt's debug dump directory. -.P -To distinguish between new crashes and crashes -that were already reported, the plugin makes its own entry -in the log file, which acts as a separator. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. -No parameters are necessary. -.SH CONFIGURATION -The \fIKerneloopsScanner.conf\fP configuration file contains one entry: -.SS SysLogFile -The file to scan. The default is -.br -SysLogFile = /var/log/messages -.SH EXAMPLES -.P -This is a snippet from the \fIabrt.conf\fP configuration file. -Every 10 seconds look if there were any kernel crashes: -.P -[common] -.br -ActionsAndReporters = Kerneloops, KerneloopsScanner -.br -[cron] -.br -10 = KerneloopsScanner -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Anton Arapov <anton@redhat.com>. Manual -page by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-Logger.7 b/lib/plugins/abrt-Logger.7 deleted file mode 100644 index 8ae679f8..00000000 --- a/lib/plugins/abrt-Logger.7 +++ /dev/null @@ -1,44 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -Logger plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fILogger\fP plugin -for \fIabrt\fP. -.P -This plugin is used to log the crash to a file. -.P -The log will contain all the file names as well as their -content. It also contains "duplicity check": the ID -of the crash, which is used to tell whether the same -crash has happened previously. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. -No parameters are necessary. -.SH CONFIGURATION -The \fILogger.conf\fP configuration file contains -several entries in a format "Option = Value". The options are: -.SS LogPath -The path to the log file. -.SS AppendLogs -If set to "yes" (the default) \fILogger\fP will append -the report to the file, otherwise it will overwrite the file (so -only the last crash will be stored). -.SH EXAMPLES -.P -This is a snippet from the \fIabrt.conf\fP configuration file. -Log all the C/C++ application crashes: -.P -[AnalyzerActionsAndReporters] -.br -CCpp = Logger -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Zdenek Prikryl <zprikryl@redhat.com>. Manual -page by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-Mailx.7 b/lib/plugins/abrt-Mailx.7 deleted file mode 100644 index 90a8bbce..00000000 --- a/lib/plugins/abrt-Mailx.7 +++ /dev/null @@ -1,57 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -Mailx plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fIMailx\fP plugin -for \fIabrt\fP. -.P -This plugin is used to mail the data about the crash -to a specified mail address. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. It can take -one parameter, a subject of the mail (if it differs from the -one specified in the \fIMailx.conf\fP configuration file). -.SH CONFIGURATION -The \fIMailx.conf\fP configuration file contains -several entries in a format "Option = Value". The options are: -.SS Subject -The subject of the mail. -.SS Parameters -The \fIMailx\fP plugin executes the external "mailx" command to -send the mail. This option defines some additional command line -parameters, which should be added to the program invocation, if any. -.SS EmailFrom -The address from which the email is sent. -.SS EmailTo -The address to which the email is sent. -.SS SendBinaryData -Can be "yes" or "no". If set to "yes", the email will also -contain the binary files associated with the crash. Warning: -this can cause the emails to be large! (several MB) -.SH EXAMPLES -.P -These are snippets from the \fIabrt.conf\fP configuration file. -.P -1) Each time a crash happens, a mail is sent -.PP -[common] -.br -ActionsAndReporters = Mailx("[abrt] a crash occurs") -.P -2) When a program in a specific package (in this case "httpd") crashes, -send a mail about it. -.PP -[AnalyzerActionsAndReporters] -.br -CCpp:httpd = Mailx("[abrt] Apache crash") -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Zdenek Prikryl <zprikryl@redhat.com>. Manual -page by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-ReportUploader.7 b/lib/plugins/abrt-ReportUploader.7 deleted file mode 100644 index bd91f266..00000000 --- a/lib/plugins/abrt-ReportUploader.7 +++ /dev/null @@ -1,55 +0,0 @@ -.TH abrt "7" "9 July 2009" "" -.SH NAME -ReportUploader plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon which watches for application crashes. When a crash occurs, -it collects the crash data and performs some actions according to -the configuration. This manual page describes the \fIReportUploader\fP plugin -for \fIabrt\fP. -.P -This plugin will send a report to an anonymous FTP site. It's intended -for use in cases where a ticketing system is associated with the FTP site, -but the ticketing system has no way to automatically create new tickets, -or add to existing tickets. Customer Name is put in config file. -Ticket name (or number) is also put in config file. If no ticket -name is configured, assume ticketing system should create a new ticket. -This information is added to the report, the report is copied into a -compressed, optionally encrypted, tarball. Then the tarball is FTP'd -to the upload site. Then a status string is displayed to the user -showing the name of the file on the FTP site, it's MD5SUM, and -it's encryption key. This information can be pasted into a ticket -in the ticketing system. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file. -No parameters are necessary. -.SH CONFIGURATION -The \fIReportUploader.conf\fP configuration file contains -entries in a format "Option = Value". The options are: -.SS Customer -This is the customer's name or other customer identifier. -.SS Ticket -This is the ticket name or number. -.SS Encrypt -"yes" for encrypt upload, anything else for not. -.SS Upload -"yes" for for upload to FTP site, anything else for copy to local /tmp. -.SS URL -URL of upload site (ie. ftp://support.com/upload). -.SH EXAMPLES -.P -This is a snippet from the \fIabrt.conf\fP configuration file. -Log all the C/C++ application crashes: -.P -[AnalyzerActionsAndReporters] -.br -CCpp = RHUpload -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Plugin and man page by Gavin Romig-Koch <gavin@redhat.com>. - - diff --git a/lib/plugins/abrt-SQLite3.7 b/lib/plugins/abrt-SQLite3.7 deleted file mode 100644 index c2b39d86..00000000 --- a/lib/plugins/abrt-SQLite3.7 +++ /dev/null @@ -1,36 +0,0 @@ -.TH abrt "7" "1 Jun 2009" "" -.SH NAME -SQLite3 database plugin for abrt(8) -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data and takes action according to -its configuration. This manual page describes the \fISQLite3\fP database plugin -for \fIabrt\fP. -.P -This is a database plugin: \fIabrt\fP needs a database in which to store -its metadata. You can choose one by specifying "Database" in -the \fIabrt.conf\fP configuration file. Currently SQLite3 is -the only choice supported. -.SH INVOCATION -The plugin is invoked in the \fIabrt.conf\fP configuration file, like -this: -.br -[common] -.br -Database = SQLite3 -.SH CONFIGURATION -The \fISQLite3.conf\fP configuration file contains one entry: -.SS DBPath -The path to the database. -.SH EXAMPLES -see \fBINVOCATION\fP -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Zdenek Prikryl <zprikryl@redhat.com> and Jiri -Moskovcak <jmoskovc@redhat.com>. Manual -page by Daniel Novotny <dnovotny@redhat.com>. diff --git a/lib/plugins/abrt-plugins.7 b/lib/plugins/abrt-plugins.7 deleted file mode 100644 index 6c07e65a..00000000 --- a/lib/plugins/abrt-plugins.7 +++ /dev/null @@ -1,43 +0,0 @@ -.TH abrt "8" "28 May 2009" "" -.SH NAME -abrt-plugins \- plugins for the abrt crash reporter program -.SH DESCRIPTION -.P -.I abrt -is a daemon that watches for application crashes. When a crash occurs, -it collects the crash data (core file, application's command line etc.) -and takes action according to the type of application that -crashed and according to the configuration specified in the -.I abrt.conf -configuration file. -.P -Plugins allow abrt to perform various actions: for example, -to report the crash to Bugzilla, to mail the report, to transfer -the report via FTP or SCP, or to run a program that you specify. -.P -This manual page provides a list of all the manual pages for -these plugins. -.P -If you want to create your own plugin, refer to the PLUGINS-HOWTO -file in the documentation directory. -.SH INVOCATION -Each plugin is invoked in the \fIabrt.conf\fP configuration -file, in the section that is appropriate to what you -want abrt to do. -.SH CONFIGURATION -Almost every plugin has its configuration file, -stored in the \fI/etc/abrt/plugins\fP directory. -.SH "SEE ALSO" -.IR abrt (8), -.IR abrt.conf (5), -.IR abrt-Bugzilla (7), -.IR abrt-FileTransfer (7), -.IR abrt-KerneloopsReporter (7), -.IR abrt-KerneloopsScanner (7), -.IR abrt-Logger (7), -.IR abrt-Mailx (7), -.IR abrt-SQLite3 (7) -.SH AUTHOR -\fIabrt\fP written by Zdeněk Přikryl <zprikryl@redhat.com> and -Jiří Moskovčák <jmoskovc@redhat.com>. Manual page written by Daniel -Novotný <dnovotny@redhat.com>. |