From a47026057cd99a0e1eb34d51ed644cc66ae20bc6 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 5 Oct 2009 21:42:16 +0200 Subject: removed unsecure reading/writting from ~HOME directory - daemon eunning under root can't read/write from ~HOME, so reading/writting config files have been moved to client (GUI) - uses gnome keyring to store the credentials --- src/Daemon/CommLayerServerDBus.cpp | 12 ++++--- src/Daemon/PluginManager.cpp | 13 +++++++- src/Gui/ABRTExceptions.py | 11 ++++++- src/Gui/ABRTPlugin.py | 49 ++++++++++++++++------------- src/Gui/CCDBusBackend.py | 2 +- src/Gui/ConfBackend.py | 64 ++++++++++++++++++++++++++++++++++++++ src/Gui/Makefile.am | 2 +- src/Gui/PluginList.py | 33 ++++++++------------ src/Gui/PluginSettingsUI.py | 7 +++-- src/Gui/PluginsSettingsDialog.py | 3 +- 10 files changed, 144 insertions(+), 52 deletions(-) create mode 100644 src/Gui/ConfBackend.py (limited to 'src') diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index 22dc2e6..1085d80 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -253,14 +253,19 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) } + const char * sender = dbus_message_get_sender(call); if (!user_conf_data.empty()) { -#if DEBUG + std::string PluginName; + map_plugin_settings_t plugin_settings; map_map_string_t::const_iterator it_user_conf_data; for (it_user_conf_data = user_conf_data.begin(); it_user_conf_data != user_conf_data.end(); it_user_conf_data++) { map_string_t::const_iterator it_plugin_config; map_string_t plugin_config = it_user_conf_data->second; + PluginName = it_user_conf_data->first; + plugin_settings = it_user_conf_data->second; +#if DEBUG std::cout << "plugin name: " << it_user_conf_data->first; for (it_plugin_config = it_user_conf_data->second.begin(); it_plugin_config != it_user_conf_data->second.end(); @@ -268,10 +273,9 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) { std::cout << " key: " << it_plugin_config->first << " value: " << it_plugin_config->second << std::endl; } - } #endif - const char * sender = dbus_message_get_sender(call); - SetSettings(user_conf_data, sender); + g_pPluginManager->SetPluginSettings(PluginName, sender, plugin_settings); + } } //so far, user_conf_data is unused diff --git a/src/Daemon/PluginManager.cpp b/src/Daemon/PluginManager.cpp index 4c1dae5..bd5727e 100644 --- a/src/Daemon/PluginManager.cpp +++ b/src/Daemon/PluginManager.cpp @@ -420,12 +420,18 @@ void CPluginManager::SetPluginSettings(const std::string& pName, return; } + /** we don't want to save it from daemon if it's running under root + but wi might get back to this once we make the daemon to not run + with root privileges + */ + /* SavePluginSettings(confPath, pSettings); if (chown(confPath.c_str(), uid, gid) == -1) { perror_msg("Can't change '%s' ownership to %u:%u", confPath.c_str(), (int)uid, (int)gid); return; } + */ } } } @@ -443,7 +449,11 @@ map_plugin_settings_t CPluginManager::GetPluginSettings(const std::string& pName if (plugin != m_mapPlugins.end()) { ret = plugin->second->GetSettings(); - + /** we don't want to load it from daemon if it's running under root + but wi might get back to this once we make the daemon to not run + with root privileges + */ + /* if (abrt_plugin->second->GetType() == REPORTER) { std::string home = get_home_dir(atoi(pUID.c_str())); @@ -452,6 +462,7 @@ map_plugin_settings_t CPluginManager::GetPluginSettings(const std::string& pName LoadPluginSettings(home + "/.abrt/" + pName + "."PLUGINS_CONF_EXTENSION, ret); } } + */ return ret; } } diff --git a/src/Gui/ABRTExceptions.py b/src/Gui/ABRTExceptions.py index 791654f..3049638 100644 --- a/src/Gui/ABRTExceptions.py +++ b/src/Gui/ABRTExceptions.py @@ -2,14 +2,23 @@ from abrt_utils import _ class IsRunning(Exception): def __init__(self): + Exception.__init__(self) self.what = _("Another client is already running, trying to wake it.") def __str__(self): return self.what class WrongData(Exception): def __init__(self): + Exception.__init__(self) self.what = _("Got unexpected data from daemon (is the database properly updated?).") def __str__(self): return self.what - + +class ConfBackendInitError(Exception): + def __init__(self, msg): + Exception.__init__(self) + self.what = msg + + def __str__(self): + return self.what diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py index 181126a..590a0de 100644 --- a/src/Gui/ABRTPlugin.py +++ b/src/Gui/ABRTPlugin.py @@ -16,27 +16,33 @@ from ConfBackend import ConfBackendGnomeKeyring class PluginSettings(dict): def __init__(self): dict.__init__(self) - #print "Init plugin settings" + self.conf = ConfBackendGnomeKeyring() - def __init__(self, settings_dict): - dict.__init__(self) - for key in settings_dict.keys(): - self[key] = settings_dict[key] - def check(self): - if "Password" in self.keys(): - # password is missing - if not self["Password"]: - return False + for key in ["Password", "Login"]: + if key in self.keys(): + # some of the required keys is missing + if not self[key]: + return False # settings are OK return True - - def load(self, name): + + def load(self, name, default_settings): print "load:", name - + # load settings from daemon + for key in default_settings.keys(): + self[str(key)] = str(default_settings[key]) + + settings = self.conf.load(name) + # overwrite defaluts with user setting + for key in settings.keys(): + self[str(key)] = str(settings[key]) + print str(key), str(settings[key]) + def save(self, name): print "save: ", name - + self.conf.save(name, self) + class PluginInfo(): """Class to represent common plugin info""" types = {"Analyzer":_("Analyzer plugins"), @@ -57,7 +63,7 @@ class PluginInfo(): self.Type = None self.Email = None self.Description = None - self.Settings = PluginSettings({}) + self.Settings = PluginSettings() def getName(self): return self.Name @@ -76,12 +82,13 @@ class PluginInfo(): def __getitem__(self, item): return self.__dict__[item] - - def load_settings(self): + + def load_settings(self, default_settings): if self.Name: - self.Settings.load(self.Name) + print self.Name + self.Settings.load(self.Name, default_settings) else: - print "plugin name is not set, can't load it's settings" - + print _("Plugin name is not set, can't load it's settings") + def save_settings(self): - self.Settings.save(self.Name) + self.Settings.save(str(self.Name)) diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index 71a50e2..f1ab443 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -176,7 +176,7 @@ class DBusManager(gobject.GObject): def Report(self, report, reporters_settings = None): # map < Plguin_name vec > - self.cc.Report(report,reporters_settings, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60) + self.cc.Report(report, reporters_settings, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60) def DeleteDebugDump(self,UUID): return self.cc.DeleteDebugDump(UUID) diff --git a/src/Gui/ConfBackend.py b/src/Gui/ConfBackend.py new file mode 100644 index 0000000..5cbd9f9 --- /dev/null +++ b/src/Gui/ConfBackend.py @@ -0,0 +1,64 @@ +from ABRTExceptions import ConfBackendInitError +from abrt_utils import _ + +#FIXME: add some backend factory + +try: + import gnomekeyring as gkey +except ImportError, e: + print e + gkey = None + +class ConfBackend(object): + def __init__(self): + pass + + def save(self, name, settings): + """ Default save method has to be implemented in derived class """ + raise NotImplementedError + + def load(self, name): + """ Default load method has to be implemented in derived class """ + raise NotImplementedError + + +class ConfBackendGnomeKeyring(ConfBackend): + def __init__(self): + ConfBackend.__init__(self) + self.default_key_ring = gkey.get_default_keyring_sync() + if not gkey.is_available(): + raise ConfBackendInitError(_("Can't connect do Gnome Keyring daemon")) + + def save(self, name, settings): + print settings + settings_tmp = settings.copy() + settings_tmp["AbrtPluginInfo"] = name + password = "" + + if "Password" in settings_tmp: + print "saving password" + password = settings_tmp["Password"] + del settings_tmp["Password"] + gkey.item_create_sync(self.default_key_ring, + gkey.ITEM_GENERIC_SECRET, + "abrt:%s" % name, + settings_tmp, + password, + True) + + def load(self, name): + item_list = None + try: + item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)}) + except gkey.NoMatchError, ex: + print "kekeke" + if item_list: + print ">>> neco" + retval = item_list[0].attributes.copy() + retval["Password"] = item_list[0].secret + return retval + else: + return {} + #for i in item_list: + # for attr in i.attributes: + # print attr, i.attributes[attr] diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am index 66317f9..a3993fa 100644 --- a/src/Gui/Makefile.am +++ b/src/Gui/Makefile.am @@ -6,7 +6,7 @@ PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \ CCReporterDialog.py CCReport.py abrt_utils.py \ CCMainWindow.py CellRenderers.py ABRTExceptions.py \ SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \ - PluginsSettingsDialog.py + PluginsSettingsDialog.py ConfBackend.py GLADE_FILES = ccgui.glade report.glade settings.glade dialogs.glade diff --git a/src/Gui/PluginList.py b/src/Gui/PluginList.py index 13c9537..e57040d 100644 --- a/src/Gui/PluginList.py +++ b/src/Gui/PluginList.py @@ -11,26 +11,19 @@ class PluginInfoList(list): def load(self): if self.dm: #print "loading PluginList" - try: - rows = self.dm.getPluginsInfo() - #print rows - for row in rows: - entry = PluginInfo() - for column in row: - #print "PluginInfoList adding %s:%s" % (column,row[column]) - entry.__dict__[column] = row[column] - if entry.Enabled == "yes": - #print ">>%s<<" % entry - entry.Settings = PluginSettings(self.dm.getPluginSettings(str(entry))) - #for i in entry.Settings.keys(): - # print "%s: %s" % (i, entry.Settings[i]) - #else: - # print "%s is disabled" % entry - self.append(entry) - self.ddict[entry.getName()] = entry - except Exception, e: - print e - return + rows = self.dm.getPluginsInfo() + #print rows + for row in rows: + entry = PluginInfo() + for column in row: + #print "PluginInfoList adding %s:%s" % (column,row[column]) + entry.__dict__[column] = row[column] + if entry.Enabled == "yes": + #entry.Settings = PluginSettings(self.dm.getPluginSettings(str(entry))) + default_settings = self.dm.getPluginSettings(str(entry)) + entry.load_settings(default_settings) + self.append(entry) + self.ddict[entry.getName()] = entry else: print "db == None!" diff --git a/src/Gui/PluginSettingsUI.py b/src/Gui/PluginSettingsUI.py index 02c0317..ae5b64d 100644 --- a/src/Gui/PluginSettingsUI.py +++ b/src/Gui/PluginSettingsUI.py @@ -1,7 +1,8 @@ import gtk from abrt_utils import _ + class PluginSettingsUI(gtk.Dialog): - def __init__(self, pluginfo): + def __init__(self, pluginfo, parent=None): #print "Init PluginSettingsUI" gtk.Dialog.__init__(self) self.plugin_name = pluginfo.Name @@ -16,6 +17,8 @@ class PluginSettingsUI(gtk.Dialog): if not self.dialog: raise Exception(_("Can't find PluginDialog widget in UI description!")) self.dialog.set_title("%s" % pluginfo.getName()) + if parent: + self.dialog.set_transient_for(parent) else: # we shouldn't get here, but just to be safe no_ui_label = gtk.Label(_("No UI for plugin %s" % pluginfo)) @@ -27,7 +30,7 @@ class PluginSettingsUI(gtk.Dialog): if self.pluginfo.Enabled == "yes": if self.Settings: #print "Hydrating %s" % self.plugin_name - for key,value in self.Settings.iteritems(): + for key, value in self.Settings.iteritems(): #print "%s:%s" % (key,value) widget = self.plugin_gui.get_object("conf_%s" % key) if type(widget) == gtk.Entry: diff --git a/src/Gui/PluginsSettingsDialog.py b/src/Gui/PluginsSettingsDialog.py index a6420b1..a346455 100644 --- a/src/Gui/PluginsSettingsDialog.py +++ b/src/Gui/PluginsSettingsDialog.py @@ -130,9 +130,10 @@ class PluginsSettingsDialog: ui.dehydrate() if pluginfo.Settings: try: + pluginfo.save_settings() self.ccdaemon.setPluginSettings(pluginfo.getName(), pluginfo.Settings) except Exception, e: - gui_error_message(_("Can't save plugin settings:\n %s", e)) + gui_error_message(_("Can't save plugin settings:\n %s" % e)) #for key, val in pluginfo.Settings.iteritems(): # print "%s:%s" % (key, val) elif response == gtk.RESPONSE_CANCEL: -- cgit From 1c49dbd5e7157e1b211b6de4be5e2d69883b9edb Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Mon, 5 Oct 2009 22:00:39 +0200 Subject: GUI: code cleanup, removed some debugging messages --- src/Gui/ABRTPlugin.py | 4 ---- src/Gui/CCReport.py | 1 - src/Gui/ConfBackend.py | 8 +++----- 3 files changed, 3 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py index 590a0de..5bae6d9 100644 --- a/src/Gui/ABRTPlugin.py +++ b/src/Gui/ABRTPlugin.py @@ -28,7 +28,6 @@ class PluginSettings(dict): return True def load(self, name, default_settings): - print "load:", name # load settings from daemon for key in default_settings.keys(): self[str(key)] = str(default_settings[key]) @@ -37,10 +36,8 @@ class PluginSettings(dict): # overwrite defaluts with user setting for key in settings.keys(): self[str(key)] = str(settings[key]) - print str(key), str(settings[key]) def save(self, name): - print "save: ", name self.conf.save(name, self) class PluginInfo(): @@ -85,7 +82,6 @@ class PluginInfo(): def load_settings(self, default_settings): if self.Name: - print self.Name self.Settings.load(self.Name, default_settings) else: print _("Plugin name is not set, can't load it's settings") diff --git a/src/Gui/CCReport.py b/src/Gui/CCReport.py index 66de1e9..90c8a3b 100644 --- a/src/Gui/CCReport.py +++ b/src/Gui/CCReport.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -from datetime import datetime class Report(): """Class for mapping the report to pyhon object""" diff --git a/src/Gui/ConfBackend.py b/src/Gui/ConfBackend.py index 5cbd9f9..e0f6434 100644 --- a/src/Gui/ConfBackend.py +++ b/src/Gui/ConfBackend.py @@ -6,7 +6,6 @@ from abrt_utils import _ try: import gnomekeyring as gkey except ImportError, e: - print e gkey = None class ConfBackend(object): @@ -30,13 +29,11 @@ class ConfBackendGnomeKeyring(ConfBackend): raise ConfBackendInitError(_("Can't connect do Gnome Keyring daemon")) def save(self, name, settings): - print settings settings_tmp = settings.copy() settings_tmp["AbrtPluginInfo"] = name password = "" if "Password" in settings_tmp: - print "saving password" password = settings_tmp["Password"] del settings_tmp["Password"] gkey.item_create_sync(self.default_key_ring, @@ -51,9 +48,10 @@ class ConfBackendGnomeKeyring(ConfBackend): try: item_list = gkey.find_items_sync(gkey.ITEM_GENERIC_SECRET, {"AbrtPluginInfo":str(name)}) except gkey.NoMatchError, ex: - print "kekeke" + # nothing found + pass + if item_list: - print ">>> neco" retval = item_list[0].attributes.copy() retval["Password"] = item_list[0].secret return retval -- cgit From 318ee51098caa3a06b45823f2c96b4e68f27b459 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Oct 2009 14:48:51 +0200 Subject: Fix Bug 526220 - [abrt] crash detected in abrt-gui-0.0.9-2.fc12 Caused by lack of sanity checking on .conf contents... Signed-off-by: Denys Vlasenko --- src/Gui/SettingsDialog.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/Gui/SettingsDialog.py b/src/Gui/SettingsDialog.py index 4d85cd7..596a5f9 100644 --- a/src/Gui/SettingsDialog.py +++ b/src/Gui/SettingsDialog.py @@ -76,7 +76,7 @@ class SettingsDialog: self.pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) except Exception, e: print "SettingsDialog: ", e - + ## hydrate cron jobs: for key,val in self.settings["Cron"].iteritems(): # actionas are separated by ',' @@ -91,6 +91,9 @@ class SettingsDialog: self.settings["Cron"][key].remove(plugin.getName()) # hydrate common common = self.settings["Common"] + # ensure that all expected keys exist: + if not common.has_key("OpenGPGCheck"): + common["OpenGPGCheck"] = "no" # check unsigned pkgs too ## gpgcheck self.builder.get_object("cbOpenGPGCheck").set_active(common["OpenGPGCheck"] == 'yes') ## database -- cgit From b3dcc2ccd55d9e380f9fe0e040aacfbc046d380d Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 6 Oct 2009 14:49:47 +0200 Subject: GUI: call Report() with the latest pluginsettings - pluginlist is cached so it should be refreshed before Report() is called otherwise we get the old settings to the daemon --- src/Gui/ABRTPlugin.py | 5 ++++- src/Gui/CCMainWindow.py | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py index 5bae6d9..8d687f8 100644 --- a/src/Gui/ABRTPlugin.py +++ b/src/Gui/ABRTPlugin.py @@ -35,7 +35,10 @@ class PluginSettings(dict): settings = self.conf.load(name) # overwrite defaluts with user setting for key in settings.keys(): - self[str(key)] = str(settings[key]) + # only rewrite keys needed by the plugin + # e.g we don't want a pass field for logger + if key in default_settings.keys(): + self[str(key)] = str(settings[key]) def save(self, name): self.conf.save(name, self) diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index f8a2054..1b4848d 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -126,7 +126,7 @@ class MainWindow(): # load data #self.load() - self.pluginlist = getPluginInfoList(self.ccdaemon) + self.pluginlist = None def on_daemon_state_changed_cb(self, widget, state): if state == "up": @@ -299,6 +299,7 @@ class MainWindow(): self.pBarWindow.show_all() self.timer = gobject.timeout_add(100, self.progress_update_cb) reporters_settings = {} + self.pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) for plugin in self.pluginlist.getReporterPlugins(): reporters_settings[str(plugin)] = plugin.Settings self.ccdaemon.Report(result, reporters_settings) -- cgit From 7b0bb706e4c898ca47e11311b4337ea8f99d59a8 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 6 Oct 2009 15:13:40 +0200 Subject: small code fixes, no logic changes - has_key has been deprecated, so I removed it to avoid deprecation warning --- src/Gui/SettingsDialog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/Gui/SettingsDialog.py b/src/Gui/SettingsDialog.py index 596a5f9..b3af501 100644 --- a/src/Gui/SettingsDialog.py +++ b/src/Gui/SettingsDialog.py @@ -92,7 +92,7 @@ class SettingsDialog: # hydrate common common = self.settings["Common"] # ensure that all expected keys exist: - if not common.has_key("OpenGPGCheck"): + if "OpenGPGCheck" not in common: common["OpenGPGCheck"] = "no" # check unsigned pkgs too ## gpgcheck self.builder.get_object("cbOpenGPGCheck").set_active(common["OpenGPGCheck"] == 'yes') @@ -115,7 +115,7 @@ class SettingsDialog: AnalyzerActionsAndReporters = self.settings["AnalyzerActionsAndReporters"] for analplugin in self.pluginlist.getAnalyzerPlugins(): it = self.analyzerPluginsListStore.append([analplugin.getName(), analplugin]) - if AnalyzerActionsAndReporters.has_key(analplugin.getName()): + if analplugin.getName() in AnalyzerActionsAndReporters: action = (AnalyzerActionsAndReporters[analplugin.getName()], it) self.add_AnalyzerAction(action) -- cgit From 3441533d3bf93bec4d6d6a1826bb3d053f337b2f Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 6 Oct 2009 15:34:19 +0200 Subject: rename abrt.8 to abrtd.8 Signed-off-by: Denys Vlasenko --- src/Daemon/Makefile.am | 2 +- src/Daemon/abrt.8 | 38 -------------------------------------- src/Daemon/abrtd.8 | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 39 deletions(-) delete mode 100644 src/Daemon/abrt.8 create mode 100644 src/Daemon/abrtd.8 (limited to 'src') diff --git a/src/Daemon/Makefile.am b/src/Daemon/Makefile.am index b41f8ec..29c7f1b 100644 --- a/src/Daemon/Makefile.am +++ b/src/Daemon/Makefile.am @@ -42,7 +42,7 @@ dist_polkitconf_DATA = org.fedoraproject.abrt.policy comredhatabrtservicedir = ${datadir}/dbus-1/system-services dist_comredhatabrtservice_DATA = com.redhat.abrt.service -man_MANS = abrt.8 abrt.conf.5 +man_MANS = abrtd.8 abrt.conf.5 EXTRA_DIST = $(man_MANS) DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@ diff --git a/src/Daemon/abrt.8 b/src/Daemon/abrt.8 deleted file mode 100644 index b106041..0000000 --- a/src/Daemon/abrt.8 +++ /dev/null @@ -1,38 +0,0 @@ -.TH abrt "8" "28 May 2009" "" -.SH NAME -abrt \- an automated bug-reporting tool -.SH SYNOPSIS -.B abrt [ -d ] -.SH DESCRIPTION -.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 in the -.I abrt.conf -config file. There are plugins for various actions: for example to report -the crash to Bugzilla, to mail the report, or to transfer the -report via FTP or SCP. See the manual pages for the -respective plugins. -.SH OPTIONS - -.TP - -.B "\-d" - -This option causes -.I abrt -to print more debugging information when the daemon is started. -.SH CAVEATS -When you use some other crash-catching tool, specific for an application -or an application type (for example BugBuddy for GNOME applications), -crashes of this type will be handled by that tool and -not by \fIabrt\fP. If you want \fIabrt\fP to handle these crashes, -turn off the higher-level crash-catching tool. -.SH "SEE ALSO" -.IR abrt.conf (5), -.IR abrt-plugins (7) -.SH AUTHOR -Written by Zdeněk Přikryl and -Jiří Moskovčák . Manual page written by Daniel -Novotný . diff --git a/src/Daemon/abrtd.8 b/src/Daemon/abrtd.8 new file mode 100644 index 0000000..b106041 --- /dev/null +++ b/src/Daemon/abrtd.8 @@ -0,0 +1,38 @@ +.TH abrt "8" "28 May 2009" "" +.SH NAME +abrt \- an automated bug-reporting tool +.SH SYNOPSIS +.B abrt [ -d ] +.SH DESCRIPTION +.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 in the +.I abrt.conf +config file. There are plugins for various actions: for example to report +the crash to Bugzilla, to mail the report, or to transfer the +report via FTP or SCP. See the manual pages for the +respective plugins. +.SH OPTIONS + +.TP + +.B "\-d" + +This option causes +.I abrt +to print more debugging information when the daemon is started. +.SH CAVEATS +When you use some other crash-catching tool, specific for an application +or an application type (for example BugBuddy for GNOME applications), +crashes of this type will be handled by that tool and +not by \fIabrt\fP. If you want \fIabrt\fP to handle these crashes, +turn off the higher-level crash-catching tool. +.SH "SEE ALSO" +.IR abrt.conf (5), +.IR abrt-plugins (7) +.SH AUTHOR +Written by Zdeněk Přikryl and +Jiří Moskovčák . Manual page written by Daniel +Novotný . -- cgit