From 76585105247365dd9f84997d933eeabd4303aabd Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 7 Sep 2009 18:36:29 +0200 Subject: preparatory work for proper (i.e. unicast) server->client dbus communication + /* send unicast dbus signal */ + if (!dbus_message_set_destination(msg, pDest)) + die_out_of_memory(); Signed-off-by: Denys Vlasenko --- src/Daemon/CommLayerServerDBus.cpp | 13 +++++++++++-- src/Daemon/CrashWatcher.cpp | 3 ++- src/Daemon/Daemon.cpp | 3 ++- src/Daemon/MiddleWare.cpp | 22 +++++++++++++++------- 4 files changed, 30 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index c3cef3b..051a4b2 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -363,6 +363,7 @@ void CCommLayerServerDBus::Crash(const std::string& progname, const std::string& DBUS_TYPE_STRING, &c_progname, DBUS_TYPE_STRING, &c_uid, DBUS_TYPE_INVALID); + VERB2 log("Sending signal Crash('%s','%s')", c_progname, c_uid); send_flush_and_unref(msg); } @@ -373,28 +374,35 @@ void CCommLayerServerDBus::AnalyzeComplete(const map_crash_report_t& arg1) DBusMessageIter out_iter; dbus_message_iter_init_append(msg, &out_iter); store_val(&out_iter, arg1); + VERB2 log("Sending signal AnalyzeComplete([%d elements])", (int)arg1.size()); send_flush_and_unref(msg); } void CCommLayerServerDBus::JobDone(const char* pDest, uint64_t job_id) { DBusMessage* msg = new_signal_msg("JobDone"); - /* TODO: if (!dbus_message_set_destination(msg, pDest) die_out_of_memory(); */ + /* send unicast dbus signal */ + if (!dbus_message_set_destination(msg, pDest)) + die_out_of_memory(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_UINT64, &job_id, DBUS_TYPE_INVALID); + VERB2 log("Sending signal JobDone('%s',%llx)", pDest, (unsigned long long)job_id); send_flush_and_unref(msg); } void CCommLayerServerDBus::JobStarted(const char* pDest, uint64_t job_id) { DBusMessage* msg = new_signal_msg("JobStarted"); - /* TODO: if (!dbus_message_set_destination(msg, pDest) die_out_of_memory(); */ + /* send unicast dbus signal */ + if (!dbus_message_set_destination(msg, pDest)) + die_out_of_memory(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_UINT64, &job_id, DBUS_TYPE_INVALID); + VERB2 log("Sending signal JobStarted('%s',%llx)", pDest, (unsigned long long)job_id); send_flush_and_unref(msg); } @@ -419,6 +427,7 @@ void CCommLayerServerDBus::Update(const std::string& pMessage, uint64_t job_id) send_flush_and_unref(msg); } +/* TODO: one Warning()? */ void CCommLayerServerDBus::Warning(const std::string& pMessage) { DBusMessage* msg = new_signal_msg("Warning"); diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index 06afabd..1b17af6 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -142,6 +142,7 @@ static void *create_report(void *arg) pthread_mutex_lock(&g_pJobsMutex); g_pending_jobs[std::string(thread_data->UID)][uint64_t(thread_data->thread_id)] = crashReport; pthread_mutex_unlock(&g_pJobsMutex); + g_pCommLayer->JobDone(thread_data->dest, uint64_t(thread_data->thread_id)); } catch (CABRTException& e) @@ -179,7 +180,7 @@ uint64_t CreateReport_t(const char* pUUID, const char* pUID, const char* pSender free(thread_data->dest); free(thread_data); /* The only reason this may happen is system-wide resource starvation, - * or ulimit is exceeded (someoune floods us with CreateReport() dbus calls?) + * or ulimit is exceeded (someone floods us with CreateReport() dbus calls?) */ error_msg("cannot create thread"); return 0; diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index fc28e8b..149b2bd 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -503,7 +503,8 @@ static gboolean handle_event_cb(GIOChannel *gio, GIOCondition condition, gpointe /* ignore lock files and such */ if (!(event->mask & IN_ISDIR)) { - VERB3 log("File '%s' creation detected, ignoring", name); + // Happens all the time during normal run + //VERB3 log("File '%s' creation detected, ignoring", name); continue; } diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index e6c9187..4f499d6 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -173,33 +173,42 @@ mw_result_t CreateCrashReport(const std::string& pUUID, const std::string& pUID, map_crash_report_t& pCrashReport) { - CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); - database_row_t row; - database->Connect(); - row = database->GetUUIDData(pUUID, pUID); - database->DisConnect(); - CDebugDump dd; + VERB2 log("CreateCrashReport('%s','%',result)", pUUID.c_str(), pUID.c_str()); + database_row_t row; + if (pUUID != "") + { + CDatabase* database = g_pPluginManager->GetDatabase(g_settings_sDatabase); + database->Connect(); + row = database->GetUUIDData(pUUID, pUID); + database->DisConnect(); + } if (pUUID == "" || row.m_sUUID != pUUID) { warn_client("CreateCrashReport(): UUID '"+pUUID+"' is not in database."); return MW_IN_DB_ERROR; } + CDebugDump dd; try { std::string analyzer; std::string gUUID; + VERB3 log(" LoadText(FILENAME_ANALYZER,'%s')", row.m_sDebugDumpDir.c_str()); dd.Open(row.m_sDebugDumpDir); dd.LoadText(FILENAME_ANALYZER, analyzer); dd.Close(); + VERB3 log(" CreateReport('%s')", analyzer.c_str()); CreateReport(analyzer, row.m_sDebugDumpDir); gUUID = GetGlobalUUID(analyzer, row.m_sDebugDumpDir); + VERB3 log(" GetGlobalUUID:'%s'", gUUID.c_str()); + VERB3 log(" RunAnalyzerActions"); RunAnalyzerActions(analyzer, row.m_sDebugDumpDir); + VERB3 log(" DebugDumpToCrashReport"); DebugDumpToCrashReport(row.m_sDebugDumpDir, pCrashReport); add_crash_data_to_crash_report(pCrashReport, CD_UUID, CD_TXT, CD_ISNOTEDITABLE, gUUID); @@ -245,7 +254,6 @@ void RunAction(const std::string& pActionDir, warn_client("RunAction(): " + e.what()); update_client("Execution of '"+pPluginName+"' was not successful: " + e.what()); } - } void RunActionsAndReporters(const std::string& pDebugDumpDir) -- cgit From 18b37184fad31d40a9344f9f5e22f7675c909d65 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 01:50:15 +0200 Subject: abrtd: remove unused AnalyzeComplete dbus signal Signed-off-by: Denys Vlasenko --- src/Daemon/CommLayerServer.h | 1 - src/Daemon/CommLayerServerDBus.cpp | 11 ----------- src/Daemon/CommLayerServerDBus.h | 1 - src/Daemon/CommLayerServerSocket.cpp | 5 ----- src/Daemon/CommLayerServerSocket.h | 1 - 5 files changed, 19 deletions(-) (limited to 'src') diff --git a/src/Daemon/CommLayerServer.h b/src/Daemon/CommLayerServer.h index 7e6f8d7..9beb945 100644 --- a/src/Daemon/CommLayerServer.h +++ b/src/Daemon/CommLayerServer.h @@ -14,7 +14,6 @@ class CCommLayerServer { /* just stubs to be called when not implemented in specific comm layer */ virtual void Crash(const std::string& progname, const std::string& uid) {} - virtual void AnalyzeComplete(const map_crash_report_t& arg1) {} virtual void Error(const std::string& arg1) {} virtual void Update(const std::string& pMessage, uint64_t pJobID) {}; virtual void Warning(const std::string& pMessage) {}; diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index 051a4b2..41f5aba 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -367,17 +367,6 @@ void CCommLayerServerDBus::Crash(const std::string& progname, const std::string& send_flush_and_unref(msg); } -/* Notify the clients that creating a report has finished */ -void CCommLayerServerDBus::AnalyzeComplete(const map_crash_report_t& arg1) -{ - DBusMessage* msg = new_signal_msg("AnalyzeComplete"); - DBusMessageIter out_iter; - dbus_message_iter_init_append(msg, &out_iter); - store_val(&out_iter, arg1); - VERB2 log("Sending signal AnalyzeComplete([%d elements])", (int)arg1.size()); - send_flush_and_unref(msg); -} - void CCommLayerServerDBus::JobDone(const char* pDest, uint64_t job_id) { DBusMessage* msg = new_signal_msg("JobDone"); diff --git a/src/Daemon/CommLayerServerDBus.h b/src/Daemon/CommLayerServerDBus.h index 6ac702d..e205d91 100644 --- a/src/Daemon/CommLayerServerDBus.h +++ b/src/Daemon/CommLayerServerDBus.h @@ -12,7 +12,6 @@ class CCommLayerServerDBus /* DBus signal senders */ virtual void Crash(const std::string& progname, const std::string& uid); - virtual void AnalyzeComplete(const map_crash_report_t& arg1); virtual void Error(const std::string& arg1); virtual void Update(const std::string& pMessage, uint64_t pJobID); //the job id should be enough in jobdone diff --git a/src/Daemon/CommLayerServerSocket.cpp b/src/Daemon/CommLayerServerSocket.cpp index c88e0f3..ad14666 100644 --- a/src/Daemon/CommLayerServerSocket.cpp +++ b/src/Daemon/CommLayerServerSocket.cpp @@ -246,11 +246,6 @@ void CCommLayerServerSocket::Crash(const std::string& arg1) //Send("(CRASH)New Crash Detected: " + arg1); } -void CCommLayerServerSocket::AnalyzeComplete(const map_crash_report_t& arg1) -{ - //Send("(ANALYZE_COMPLETE)Analyze Complete."); -} - void CCommLayerServerSocket::Error(const std::string& arg1) { //Send("(ERROR)Error: " + arg1); diff --git a/src/Daemon/CommLayerServerSocket.h b/src/Daemon/CommLayerServerSocket.h index bf5b2ff..3fae187 100644 --- a/src/Daemon/CommLayerServerSocket.h +++ b/src/Daemon/CommLayerServerSocket.h @@ -31,7 +31,6 @@ class CCommLayerServerSocket : public CCommLayerServer virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pSender); virtual void Crash(const std::string& arg1); - virtual void AnalyzeComplete(const map_crash_report_t& arg1); virtual void Error(const std::string& arg1); virtual void JobStarted(const char* pDest, uint64_t pJobID) {}; }; -- cgit From e065ed970b01cd4d145466918921d592aeab952c Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 8 Sep 2009 12:58:19 +0200 Subject: GUI: added UI for global settings (just preview, not usable!) --- src/Gui/ABRTPlugin.py | 3 + src/Gui/CCDBusBackend.py | 13 +- src/Gui/CCMainWindow.py | 10 +- src/Gui/Makefile.am | 3 +- src/Gui/PluginList.py | 8 ++ src/Gui/PluginsSettingsDialog.py | 161 ++++++++++++++++++++++++ src/Gui/SettingsDialog.py | 161 ------------------------ src/Gui/ccgui.glade | 7 ++ src/Gui/settings.GtkBuilder | 260 ++++++++++++++++++++++++++++++++++++++- 9 files changed, 458 insertions(+), 168 deletions(-) create mode 100644 src/Gui/PluginsSettingsDialog.py delete mode 100644 src/Gui/SettingsDialog.py (limited to 'src') diff --git a/src/Gui/ABRTPlugin.py b/src/Gui/ABRTPlugin.py index da9c9e5..4a94e67 100644 --- a/src/Gui/ABRTPlugin.py +++ b/src/Gui/ABRTPlugin.py @@ -57,4 +57,7 @@ class PluginInfo(): def __str__(self): return self.Name + + def __getitem__(self, item): + return self.__dict__[item] diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index b0230bd..8e09f6d 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -171,10 +171,10 @@ class DBusManager(gobject.GObject): print "Started our job: %s" % job_id self.addJob(job_id) - def jobdone_cb(self, dest, job_id): + def jobdone_cb(self, dest, uuid): if self.uniq_name == dest: - print "Our job: %s is done." % job_id - dump = self.cc.GetJobResult(job_id) + print "Our job: %s is done." % uuid + dump = self.cc.GetJobResult(uuid) if dump: self.emit("analyze-complete", dump) else: @@ -219,7 +219,7 @@ class DBusManager(gobject.GObject): #for i in settings.keys(): # print i return settings - + def registerPlugin(self, plugin_name): return self.cc.RegisterPlugin(plugin_name) @@ -229,3 +229,8 @@ class DBusManager(gobject.GObject): def setPluginSettings(self, plugin_name, plugin_settings): return self.cc.SetPluginSettings(plugin_name, plugin_settings) + def getSettings(self): + return self.cc.GetSettings() + + def setSettings(self, settings): + return self.cc.SetSettings(settings) diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index e747256..4fe0775 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -11,6 +11,7 @@ import CCDBusBackend from CC_gui_functions import * from CCDumpList import getDumpList, DumpList from CCReporterDialog import ReporterDialog +from PluginsSettingsDialog import PluginsSettingsDialog from SettingsDialog import SettingsDialog from CCReport import Report import ABRTExceptions @@ -108,6 +109,7 @@ class MainWindow(): self.wTree.get_widget("miQuit").connect("activate", self.on_bQuit_clicked) self.wTree.get_widget("miAbout").connect("activate", self.on_miAbout_clicked) self.wTree.get_widget("miPreferences").connect("activate", self.on_miPreferences_clicked) + self.wTree.get_widget("miSettings").connect("activate", self.on_miSettings_clicked) # connect handlers for daemon signals self.ccdaemon.connect("crash", self.on_data_changed_cb, None) self.ccdaemon.connect("analyze-complete", self.on_analyze_complete_cb, self.pBarWindow) @@ -133,9 +135,15 @@ class MainWindow(): dialog.hide() def on_miPreferences_clicked(self, widget): - dialog = SettingsDialog(self.window,self.ccdaemon) + dialog = PluginsSettingsDialog(self.window,self.ccdaemon) dialog.hydrate() dialog.show() + + def on_miSettings_clicked(self, widget): + dialog = SettingsDialog(self.window, self.ccdaemon) + dialog.hydrate() + dialog.show() + self.ccdaemon.getSettings() def warning_cb(self, daemon, message=None): # try to hide the progressbar, we dont really care if it was visible .. diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am index 6435c1f..8fea394 100644 --- a/src/Gui/Makefile.am +++ b/src/Gui/Makefile.am @@ -5,7 +5,8 @@ bin_SCRIPTS = abrt-gui 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 + SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \ + SettingsDialog.py GLADE_FILES = ccgui.glade report.glade settings.GtkBuilder dialogs.GtkBuilder diff --git a/src/Gui/PluginList.py b/src/Gui/PluginList.py index 591096b..76bdf81 100644 --- a/src/Gui/PluginList.py +++ b/src/Gui/PluginList.py @@ -33,6 +33,14 @@ class PluginInfoList(list): return else: print "db == None!" + + + def getEnabledPlugins(self): + return [x for x in self if x["Enabled"] == 'yes'] + + def getActionPlugins(self): + return [x for x in self if x["Enabled"] == 'yes' and x["Type"] == 'Action'] + __PFList = None diff --git a/src/Gui/PluginsSettingsDialog.py b/src/Gui/PluginsSettingsDialog.py new file mode 100644 index 0000000..b56f9d7 --- /dev/null +++ b/src/Gui/PluginsSettingsDialog.py @@ -0,0 +1,161 @@ +import sys +import gtk +from PluginList import getPluginInfoList, PluginInfoList +from CC_gui_functions import * +from PluginSettingsUI import PluginSettingsUI +from ABRTPlugin import PluginSettings, PluginInfo +from abrt_utils import _ + +class PluginsSettingsDialog: + def __init__(self, parent, daemon): + #print "Settings dialog init" + self.ccdaemon = daemon + self.builder = gtk.Builder() + builderfile = "%s%ssettings.GtkBuilder" % (sys.path[0],"/") + #print builderfile + try: + self.builder.add_from_file(builderfile) + except Exception, e: + print e + self.window = self.builder.get_object("wPluginsSettings") + if not self.window: + raise Exception(_("Can't load gui description for SettingsDialog!")) + #self.window.set_parent(parent) + + self.pluginlist = self.builder.get_object("tvSettings") + # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin + self.pluginsListStore = gtk.TreeStore(str, bool, bool, bool, str, object) + # set filter + self.modelfilter = self.pluginsListStore.filter_new() + self.modelfilter.set_visible_func(self.filter_plugins, None) + self.pluginlist.set_model(self.modelfilter) + # =============================================== + columns = [None]*1 + columns[0] = gtk.TreeViewColumn(_("Name")) + + # create list + for column in columns: + n = self.pluginlist.append_column(column) + column.cell = gtk.CellRendererText() + column.gray_background = gtk.CellRendererText() + column.pack_start(column.cell, True) + column.pack_start(column.gray_background, True) + column.set_attributes(column.cell, markup=(n-1), visible=2) + column.set_attributes(column.gray_background, visible=3, cell_background=4) + column.set_resizable(True) + + # toggle + group_name_renderer = gtk.CellRendererText() + toggle_renderer = gtk.CellRendererToggle() + toggle_renderer.set_property('activatable', True) + toggle_renderer.connect( 'toggled', self.on_enabled_toggled, self.pluginsListStore ) + column = gtk.TreeViewColumn(_('Enabled')) + column.pack_start(toggle_renderer, True) + column.pack_start(group_name_renderer, True) + column.add_attribute( toggle_renderer, "active", 1) + column.add_attribute( toggle_renderer, "visible", 2) + column.add_attribute( group_name_renderer, "visible", 3) + column.add_attribute( group_name_renderer, "markup", 0) + column.add_attribute( group_name_renderer, "cell_background", 4) + self.pluginlist.insert_column(column, 0) + + #connect signals + self.pluginlist.connect("cursor-changed", self.on_tvDumps_cursor_changed) + self.builder.get_object("bConfigurePlugin").connect("clicked", self.on_bConfigurePlugin_clicked, self.pluginlist) + self.builder.get_object("bClose").connect("clicked", self.on_bClose_clicked) + self.builder.get_object("bConfigurePlugin").set_sensitive(False) + + def on_enabled_toggled(self,cell, path, model): + plugin = model[path][model.get_n_columns()-1] + if plugin: + if model[path][1]: + #print "self.ccdaemon.UnRegisterPlugin(%s)" % (plugin.getName()) + self.ccdaemon.unRegisterPlugin(plugin.getName()) + # FIXME: create class plugin and move this into method Plugin.Enable() + plugin.Enabled = "no" + plugin.Settings = None + else: + #print "self.ccdaemon.RegisterPlugin(%s)" % (model[path][model.get_n_columns()-1]) + self.ccdaemon.registerPlugin(plugin.getName()) + # FIXME: create class plugin and move this into method Plugin.Enable() + plugin.Enabled = "yes" + plugin.Settings = PluginSettings(self.ccdaemon.getPluginSettings(plugin.getName())) + model[path][1] = not model[path][1] + + def filter_plugins(self, model, miter, data): + return True + def hydrate(self): + #print "settings hydrate" + self.pluginsListStore.clear() + try: + pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) + except Exception, e: + print e + #gui_error_message("Error while loading plugins info, please check if abrt daemon is running\n %s" % e) + plugin_rows = {} + for plugin_type in PluginInfo.types.keys(): + it = self.pluginsListStore.append(None, ["%s" % (PluginInfo.types[plugin_type]),0 , 0, 1,"gray", None]) + plugin_rows[plugin_type] = it + for entry in pluginlist: + n = self.pluginsListStore.append(plugin_rows[entry.getType()],["%s\n%s" % (entry.getName(), entry.Description), entry.Enabled == "yes", 1, 0, "white", entry]) + self.pluginlist.expand_all() + + def dehydrate(self): + # we have nothing to save, plugin's does the work + pass + + def show(self): + self.window.show() + #if result == gtk.RESPONSE_APPLY: + # self.dehydrate() + #self.window.destroy() + #return result + + def on_bConfigurePlugin_clicked(self, button, pluginview): + pluginsListStore, path = pluginview.get_selection().get_selected_rows() + if not path: + self.builder.get_object("lDescription").set_label(_("Can't get plugin description")) + return + # this should work until we keep the row object in the last position + pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) + if pluginfo: + try: + ui = PluginSettingsUI(pluginfo) + except Exception, e: + gui_error_message(_("Error while opening plugin settings UI: \n\n%s" % e)) + return + ui.hydrate() + response = ui.run() + if response == gtk.RESPONSE_APPLY: + ui.dehydrate() + if pluginfo.Settings: + try: + self.ccdaemon.setPluginSettings(pluginfo.getName(), pluginfo.Settings) + except Exception, 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: + pass + else: + print _("unknown response from settings dialog") + ui.destroy() + + def on_bClose_clicked(self, button): + self.window.destroy() + + def on_tvDumps_cursor_changed(self, treeview): + pluginsListStore, path = treeview.get_selection().get_selected_rows() + if not path: + self.builder.get_object("lDescription").set_label("No description") + return + # this should work until we keep the row object in the last position + pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) + if pluginfo: + self.builder.get_object("lPluginAuthor").set_text(pluginfo.Email) + self.builder.get_object("lPluginVersion").set_text(pluginfo.Version) + self.builder.get_object("lPluginWebSite").set_text(pluginfo.WWW) + self.builder.get_object("lPluginName").set_text(pluginfo.Name) + self.builder.get_object("lPluginDescription").set_text(pluginfo.Description) + # print (pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "") + self.builder.get_object("bConfigurePlugin").set_sensitive(pluginfo != None and pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "") diff --git a/src/Gui/SettingsDialog.py b/src/Gui/SettingsDialog.py deleted file mode 100644 index 79dfad7..0000000 --- a/src/Gui/SettingsDialog.py +++ /dev/null @@ -1,161 +0,0 @@ -import sys -import gtk -from PluginList import getPluginInfoList, PluginInfoList -from CC_gui_functions import * -from PluginSettingsUI import PluginSettingsUI -from ABRTPlugin import PluginSettings, PluginInfo -from abrt_utils import _ - -class SettingsDialog: - def __init__(self, parent, daemon): - #print "Settings dialog init" - self.ccdaemon = daemon - self.builder = gtk.Builder() - builderfile = "%s%ssettings.GtkBuilder" % (sys.path[0],"/") - #print builderfile - try: - self.builder.add_from_file(builderfile) - except Exception, e: - print e - self.window = self.builder.get_object("wSettings") - if not self.window: - raise Exception(_("Can't load gui description for SettingsDialog!")) - #self.window.set_parent(parent) - - self.pluginlist = self.builder.get_object("tvSettings") - # cell_text, toggle_active, toggle_visible, group_name_visible, color, plugin - self.pluginsListStore = gtk.TreeStore(str, bool, bool, bool, str, object) - # set filter - self.modelfilter = self.pluginsListStore.filter_new() - self.modelfilter.set_visible_func(self.filter_plugins, None) - self.pluginlist.set_model(self.modelfilter) - # =============================================== - columns = [None]*1 - columns[0] = gtk.TreeViewColumn(_("Name")) - - # create list - for column in columns: - n = self.pluginlist.append_column(column) - column.cell = gtk.CellRendererText() - column.gray_background = gtk.CellRendererText() - column.pack_start(column.cell, True) - column.pack_start(column.gray_background, True) - column.set_attributes(column.cell, markup=(n-1), visible=2) - column.set_attributes(column.gray_background, visible=3, cell_background=4) - column.set_resizable(True) - - # toggle - group_name_renderer = gtk.CellRendererText() - toggle_renderer = gtk.CellRendererToggle() - toggle_renderer.set_property('activatable', True) - toggle_renderer.connect( 'toggled', self.on_enabled_toggled, self.pluginsListStore ) - column = gtk.TreeViewColumn(_('Enabled')) - column.pack_start(toggle_renderer, True) - column.pack_start(group_name_renderer, True) - column.add_attribute( toggle_renderer, "active", 1) - column.add_attribute( toggle_renderer, "visible", 2) - column.add_attribute( group_name_renderer, "visible", 3) - column.add_attribute( group_name_renderer, "markup", 0) - column.add_attribute( group_name_renderer, "cell_background", 4) - self.pluginlist.insert_column(column, 0) - - #connect signals - self.pluginlist.connect("cursor-changed", self.on_tvDumps_cursor_changed) - self.builder.get_object("bConfigurePlugin").connect("clicked", self.on_bConfigurePlugin_clicked, self.pluginlist) - self.builder.get_object("bClose").connect("clicked", self.on_bClose_clicked) - self.builder.get_object("bConfigurePlugin").set_sensitive(False) - - def on_enabled_toggled(self,cell, path, model): - plugin = model[path][model.get_n_columns()-1] - if plugin: - if model[path][1]: - #print "self.ccdaemon.UnRegisterPlugin(%s)" % (plugin.getName()) - self.ccdaemon.unRegisterPlugin(plugin.getName()) - # FIXME: create class plugin and move this into method Plugin.Enable() - plugin.Enabled = "no" - plugin.Settings = None - else: - #print "self.ccdaemon.RegisterPlugin(%s)" % (model[path][model.get_n_columns()-1]) - self.ccdaemon.registerPlugin(plugin.getName()) - # FIXME: create class plugin and move this into method Plugin.Enable() - plugin.Enabled = "yes" - plugin.Settings = PluginSettings(self.ccdaemon.getPluginSettings(plugin.getName())) - model[path][1] = not model[path][1] - - def filter_plugins(self, model, miter, data): - return True - def hydrate(self): - #print "settings hydrate" - self.pluginsListStore.clear() - try: - pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) - except Exception, e: - print e - #gui_error_message("Error while loading plugins info, please check if abrt daemon is running\n %s" % e) - plugin_rows = {} - for plugin_type in PluginInfo.types.keys(): - it = self.pluginsListStore.append(None, ["%s" % (PluginInfo.types[plugin_type]),0 , 0, 1,"gray", None]) - plugin_rows[plugin_type] = it - for entry in pluginlist: - n = self.pluginsListStore.append(plugin_rows[entry.getType()],["%s\n%s" % (entry.getName(), entry.Description), entry.Enabled == "yes", 1, 0, "white", entry]) - self.pluginlist.expand_all() - - def dehydrate(self): - # we have nothing to save, plugin's does the work - pass - - def show(self): - self.window.show() - #if result == gtk.RESPONSE_APPLY: - # self.dehydrate() - #self.window.destroy() - #return result - - def on_bConfigurePlugin_clicked(self, button, pluginview): - pluginsListStore, path = pluginview.get_selection().get_selected_rows() - if not path: - self.builder.get_object("lDescription").set_label(_("Can't get plugin description")) - return - # this should work until we keep the row object in the last position - pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) - if pluginfo: - try: - ui = PluginSettingsUI(pluginfo) - except Exception, e: - gui_error_message(_("Error while opening plugin settings UI: \n\n%s" % e)) - return - ui.hydrate() - response = ui.run() - if response == gtk.RESPONSE_APPLY: - ui.dehydrate() - if pluginfo.Settings: - try: - self.ccdaemon.setPluginSettings(pluginfo.getName(), pluginfo.Settings) - except Exception, 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: - pass - else: - print _("unknown response from settings dialog") - ui.destroy() - - def on_bClose_clicked(self, button): - self.window.destroy() - - def on_tvDumps_cursor_changed(self, treeview): - pluginsListStore, path = treeview.get_selection().get_selected_rows() - if not path: - self.builder.get_object("lDescription").set_label("No description") - return - # this should work until we keep the row object in the last position - pluginfo = pluginsListStore.get_value(pluginsListStore.get_iter(path[0]), pluginsListStore.get_n_columns()-1) - if pluginfo: - self.builder.get_object("lPluginAuthor").set_text(pluginfo.Email) - self.builder.get_object("lPluginVersion").set_text(pluginfo.Version) - self.builder.get_object("lPluginWebSite").set_text(pluginfo.WWW) - self.builder.get_object("lPluginName").set_text(pluginfo.Name) - self.builder.get_object("lPluginDescription").set_text(pluginfo.Description) - # print (pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "") - self.builder.get_object("bConfigurePlugin").set_sensitive(pluginfo != None and pluginfo.Enabled == "yes" and pluginfo.GTKBuilder != "") diff --git a/src/Gui/ccgui.glade b/src/Gui/ccgui.glade index 7b8dd24..67bf6fa 100644 --- a/src/Gui/ccgui.glade +++ b/src/Gui/ccgui.glade @@ -148,6 +148,13 @@ Zdenek Prikryl <zprikryl@redhat.com> True + + + True + Global settings + True + + diff --git a/src/Gui/settings.GtkBuilder b/src/Gui/settings.GtkBuilder index 575b77c..676f390 100644 --- a/src/Gui/settings.GtkBuilder +++ b/src/Gui/settings.GtkBuilder @@ -2,7 +2,7 @@ - + Settings True 450 @@ -214,4 +214,262 @@ + + Global Settings + True + 450 + 400 + + + True + vertical + + + True + True + + + True + 3 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Common + + + False + + + + + True + vertical + + + True + True + automatic + automatic + + + True + queue + + + True + vertical + + + + + + + + + + 0 + + + + + True + True + + + True + + + + + + 0 + + + + + True + + + + + + 1 + + + + + gtk-add + True + True + True + True + + + 2 + + + + + False + 1 + + + + + 1 + + + + + True + Cron + + + 1 + False + + + + + True + 3 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + True + Analyzers, Actions, Reporters + + + 2 + False + + + + + 0 + + + + + True + True + + + True + + + + + + 0 + + + + + True + 14 + True + + + gtk-cancel + True + True + True + True + + + False + 0 + + + + + gtk-ok + True + True + True + True + + + False + 1 + + + + + 1 + + + + + False + False + 1 + + + + + -- cgit From 673c753443c171a8dd79ce63029bc169296ccba7 Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 8 Sep 2009 13:07:50 +0200 Subject: Added forgotten file --- src/Gui/SettingsDialog.py | 88 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/Gui/SettingsDialog.py (limited to 'src') diff --git a/src/Gui/SettingsDialog.py b/src/Gui/SettingsDialog.py new file mode 100644 index 0000000..a2ba1f0 --- /dev/null +++ b/src/Gui/SettingsDialog.py @@ -0,0 +1,88 @@ +import sys +import gtk +from PluginList import getPluginInfoList, PluginInfoList +from CC_gui_functions import * +#from PluginSettingsUI import PluginSettingsUI +from ABRTPlugin import PluginSettings, PluginInfo +from abrt_utils import _ + +class SettingsDialog: + def __init__(self, parent, daemon): + builderfile = "%s%ssettings.GtkBuilder" % (sys.path[0],"/") + self.ccdaemon = daemon + self.builder = gtk.Builder() + self.builder.add_from_file(builderfile) + self.window = self.builder.get_object("wGlobalSettings") + print "GSD init" + self.builder.get_object("bSaveSettings").connect("clicked", self.on_ok_clicked) + self.builder.get_object("bAddCronJob").connect("clicked", self.on_bAddCronJob_clicked) + + def filter_settings(self, model, miter, data): + return True + + def hydrate(self): + try: + self.settings = self.ccdaemon.getSettings() + except Exception, e: + # FIXME: this should be error gui message! + print e + + # hydrate cron jobs: + for key,val in self.settings["Cron"].iteritems(): + try: + self.pluginlist = getPluginInfoList(self.ccdaemon, refresh=True) + except Exception, e: + print e + + hbox = gtk.HBox(homogeneous=True) + time = gtk.Entry() + plugins = gtk.ComboBox() + enabledPluginsListStore = gtk.ListStore(str, object) + cell = gtk.CellRendererText() + plugins.pack_start(cell) + plugins.add_attribute(cell, 'text', 0) + enabledPluginsListStore.append([_("Select a plugin"), None]) + for plugin in self.pluginlist.getActionPlugins(): + print "#", plugin.getName() + enabledPluginsListStore.append([plugin.getName(), plugin]) + plugins.set_model(enabledPluginsListStore) + plugins.set_active(0) + hbox.pack_start(time,False) + hbox.pack_start(plugins,False) + self.builder.get_object("vbCronJobs").pack_start(hbox,False) + hbox.show_all() + #print "\t%s:%s" % (key,val) + + def on_ok_clicked(self, button): + self.dehydrate() + + def on_bAddCronJob_clicked(self, button): + hbox = gtk.HBox(homogeneous=True) + time = gtk.Entry() + plugins = gtk.ComboBox() + enabledPluginsListStore = gtk.ListStore(str, object) + cell = gtk.CellRendererText() + plugins.pack_start(cell) + plugins.add_attribute(cell, 'text', 0) + for plugin in self.pluginlist.getActionPlugins(): + print "#", plugin.getName() + enabledPluginsListStore.append([plugin.getName(), plugin]) + plugins.set_model(enabledPluginsListStore) + plugins.set_active(0) + hbox.pack_start(time,False) + hbox.pack_start(plugins,False) + self.builder.get_object("vbCronJobs").pack_start(hbox,False) + hbox.show_all() + print "add" + + def on_cancel_clicked(self,button): + print "hide" + self.window.hide() + + def dehydrate(self): + self.ccdaemon.setSettings(self.settings) + print "dehydrate" + + def show(self): + print "show" + self.window.show() -- cgit From 5d2fb8bf5ebdf814259a01c6e429311334d2eabc Mon Sep 17 00:00:00 2001 From: Jiri Moskovcak Date: Tue, 8 Sep 2009 13:13:21 +0200 Subject: build fixes --- src/Gui/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am index 8fea394..bacfaf4 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 \ - SettingsDialog.py + PluginsSettingsDialog.py GLADE_FILES = ccgui.glade report.glade settings.GtkBuilder dialogs.GtkBuilder -- cgit From a4257108013f15653724b5ed3b3c208e071567c5 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 13:16:06 +0200 Subject: abrtd: eliminate g_pending_jobs[] map and all corresponding TODOs :) -6k: text data bss dec hexfilename 194741 2656 2384 199781 30c65abrt.t1/abrt-0.0.8.5/src/Daemon/.libs/abrtd 188316 2648 2320 193284 2f304abrt.t2/abrt-0.0.8.5/src/Daemon/.libs/abrtd Signed-off-by: Denys Vlasenko --- src/Daemon/CommLayerServer.h | 5 +- src/Daemon/CommLayerServerDBus.cpp | 82 ++++++++++++++-------------- src/Daemon/CommLayerServerDBus.h | 6 +-- src/Daemon/CommLayerServerSocket.cpp | 4 +- src/Daemon/CommLayerServerSocket.h | 3 +- src/Daemon/CrashWatcher.cpp | 100 ++++++++++++++++++++--------------- src/Daemon/CrashWatcher.h | 4 +- src/Daemon/Daemon.cpp | 9 +--- src/Daemon/Daemon.h | 3 -- src/Gui/CCDBusBackend.py | 3 +- 10 files changed, 114 insertions(+), 105 deletions(-) (limited to 'src') diff --git a/src/Daemon/CommLayerServer.h b/src/Daemon/CommLayerServer.h index 9beb945..d2d2c4e 100644 --- a/src/Daemon/CommLayerServer.h +++ b/src/Daemon/CommLayerServer.h @@ -14,11 +14,12 @@ class CCommLayerServer { /* just stubs to be called when not implemented in specific comm layer */ virtual void Crash(const std::string& progname, const std::string& uid) {} + virtual void JobDone(const char* pDest, const char* pUUID) = 0; + virtual void JobStarted(const char* pDest) {}; + virtual void Error(const std::string& arg1) {} virtual void Update(const std::string& pMessage, uint64_t pJobID) {}; virtual void Warning(const std::string& pMessage) {}; - virtual void JobDone(const char* pDest, uint64_t pJobID) = 0; - virtual void JobStarted(const char* pDest, uint64_t pJobID) {}; virtual void Warning(const std::string& pMessage, uint64_t pJobID) {}; }; diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index 41f5aba..1be957b 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -367,31 +367,32 @@ void CCommLayerServerDBus::Crash(const std::string& progname, const std::string& send_flush_and_unref(msg); } -void CCommLayerServerDBus::JobDone(const char* pDest, uint64_t job_id) +void CCommLayerServerDBus::JobStarted(const char* pDest) { - DBusMessage* msg = new_signal_msg("JobDone"); + DBusMessage* msg = new_signal_msg("JobStarted"); /* send unicast dbus signal */ if (!dbus_message_set_destination(msg, pDest)) die_out_of_memory(); + uint64_t nJobID = uint64_t(pthread_self()); dbus_message_append_args(msg, DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ - DBUS_TYPE_UINT64, &job_id, + DBUS_TYPE_UINT64, &nJobID, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); - VERB2 log("Sending signal JobDone('%s',%llx)", pDest, (unsigned long long)job_id); + VERB2 log("Sending signal JobStarted('%s',%llx)", pDest, (unsigned long long)nJobID); send_flush_and_unref(msg); } -void CCommLayerServerDBus::JobStarted(const char* pDest, uint64_t job_id) +void CCommLayerServerDBus::JobDone(const char* pDest, const char* pUUID) { - DBusMessage* msg = new_signal_msg("JobStarted"); + DBusMessage* msg = new_signal_msg("JobDone"); /* send unicast dbus signal */ if (!dbus_message_set_destination(msg, pDest)) die_out_of_memory(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ - DBUS_TYPE_UINT64, &job_id, + DBUS_TYPE_STRING, &pUUID, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); - VERB2 log("Sending signal JobStarted('%s',%llx)", pDest, (unsigned long long)job_id); + VERB2 log("Sending signal JobDone('%s','%s')", pDest, pUUID); send_flush_and_unref(msg); } @@ -493,17 +494,47 @@ static int handle_CreateReport(DBusMessage* call, DBusMessage* reply) const char* sender; long unix_uid = get_remote_uid(call, &sender); - VERB1 log("got %s('%s') call from uid %ld", "CreateReport", pUUID, unix_uid); - uint64_t argout1 = CreateReport_t(pUUID, to_string(unix_uid).c_str(), sender); + VERB1 log("got %s('%s') call from sender '%s' uid %ld", "CreateReport", pUUID, sender, unix_uid); + if (CreateReportThread(pUUID, to_string(unix_uid).c_str(), sender) != 0) + return -1; /* can't create thread (err msg is already logged) */ dbus_message_append_args(reply, - DBUS_TYPE_UINT64, &argout1, + DBUS_TYPE_STRING, &pUUID, /* redundant, eliminate from API */ DBUS_TYPE_INVALID); send_flush_and_unref(reply); return 0; } +static int handle_GetJobResult(DBusMessage* call, DBusMessage* reply) +{ + const char* pUUID; + DBusMessageIter in_iter; + if (!dbus_message_iter_init(call, &in_iter)) + { + error_msg("dbus call %s: no parameters", "GetJobResult"); + return -1; + } + int r = load_val(&in_iter, pUUID); + if (r != LAST_FIELD) + { + if (r == MORE_FIELDS) + error_msg("dbus call %s: extra parameters", "GetJobResult"); + return -1; + } + + long unix_uid = get_remote_uid(call); + VERB1 log("got %s('%s') call from uid %ld", "GetJobResult", pUUID, unix_uid); + map_crash_report_t report = GetJobResult(pUUID, to_string(unix_uid).c_str()); + + DBusMessageIter out_iter; + dbus_message_iter_init_append(reply, &out_iter); + store_val(&out_iter, report); + + send_flush_and_unref(reply); + return 0; +} + static int handle_Report(DBusMessage* call, DBusMessage* reply) { map_crash_report_t argin1; @@ -575,35 +606,6 @@ static int handle_DeleteDebugDump(DBusMessage* call, DBusMessage* reply) return 0; } -static int handle_GetJobResult(DBusMessage* call, DBusMessage* reply) -{ - uint64_t job_id; - DBusMessageIter in_iter; - if (!dbus_message_iter_init(call, &in_iter)) - { - error_msg("dbus call %s: no parameters", "GetJobResult"); - return -1; - } - int r = load_val(&in_iter, job_id); - if (r != LAST_FIELD) - { - if (r == MORE_FIELDS) - error_msg("dbus call %s: extra parameters", "GetJobResult"); - return -1; - } - - long unix_uid = get_remote_uid(call); - VERB1 log("got %s(%llx) call from uid %ld", "GetJobResult", (long long)job_id, unix_uid); - map_crash_report_t report = GetJobResult(job_id, to_string(unix_uid)); - - DBusMessageIter out_iter; - dbus_message_iter_init_append(reply, &out_iter); - store_val(&out_iter, report); - - send_flush_and_unref(reply); - return 0; -} - static int handle_GetPluginsInfo(DBusMessage* call, DBusMessage* reply) { vector_map_string_t plugins_info = g_pPluginManager->GetPluginsInfo(); diff --git a/src/Daemon/CommLayerServerDBus.h b/src/Daemon/CommLayerServerDBus.h index e205d91..979823d 100644 --- a/src/Daemon/CommLayerServerDBus.h +++ b/src/Daemon/CommLayerServerDBus.h @@ -12,11 +12,11 @@ class CCommLayerServerDBus /* DBus signal senders */ virtual void Crash(const std::string& progname, const std::string& uid); + virtual void JobStarted(const char* pDest); + virtual void JobDone(const char* pDest, const char* pUUID); + virtual void Error(const std::string& arg1); virtual void Update(const std::string& pMessage, uint64_t pJobID); - //the job id should be enough in jobdone - virtual void JobDone(const char* pDest, uint64_t pJobID); - virtual void JobStarted(const char* pDest, uint64_t pJobID); virtual void Warning(const std::string& pMessage); virtual void Warning(const std::string& pMessage, uint64_t pJobID); }; diff --git a/src/Daemon/CommLayerServerSocket.cpp b/src/Daemon/CommLayerServerSocket.cpp index ad14666..a3240a8 100644 --- a/src/Daemon/CommLayerServerSocket.cpp +++ b/src/Daemon/CommLayerServerSocket.cpp @@ -148,7 +148,7 @@ void CCommLayerServerSocket::ProcessMessage(const std::string& pMessage, GIOChan { // std::string UUID = pMessage.substr(sizeof(MESSAGE_CREATE_REPORT) - 1); // map_crash_report_t crashReport = CreateReport(UUID, UID); -//use CreateReport_t instead of CreateReport? +//use CreateReportThread instead of CreateReport? // std::string message = MESSAGE_CREATE_REPORT + crash_report_to_string(crashReport); // Send(message, pSource); } @@ -220,7 +220,7 @@ vector_crash_infos_t CCommLayerServerSocket::GetCrashInfos(const std::string &pS return crashInfos; } -//reimplement as CreateReport_t(...)? +//reimplement as CreateReportThread(...)? //map_crash_report_t CCommLayerServerSocket::CreateReport(const std::string &pUUID,const std::string &pSender) //{ // map_crash_report_t crashReport; diff --git a/src/Daemon/CommLayerServerSocket.h b/src/Daemon/CommLayerServerSocket.h index 3fae187..9d4f21c 100644 --- a/src/Daemon/CommLayerServerSocket.h +++ b/src/Daemon/CommLayerServerSocket.h @@ -31,6 +31,7 @@ class CCommLayerServerSocket : public CCommLayerServer virtual bool DeleteDebugDump(const std::string& pUUID, const std::string& pSender); virtual void Crash(const std::string& arg1); + virtual void JobStarted(const char* pDest) {}; + virtual void Error(const std::string& arg1); - virtual void JobStarted(const char* pDest, uint64_t pJobID) {}; }; diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index 1b17af6..1b147ed 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -102,48 +102,60 @@ vector_crash_infos_t GetCrashInfos(const std::string &pUID) return retval; } +/* + * "GetJobResult" is a bit of a misnomer. + * It actually _creates_ a_ report_ and returns the result. + * It is called in two cases: + * (1) by CreateReport dbus call -> CreateReportThread(), in the thread + * (2) by GetJobResult dbus call + * In the second case, it finishes quickly, because previous + * CreateReport dbus call already did all the processing, and we just retrieve + * the result from dump directory, which is fast. + */ +map_crash_report_t GetJobResult(const char* pUUID, const char* pUID) +{ + map_crash_info_t crashReport; + + mw_result_t res = CreateCrashReport(pUUID, pUID, crashReport); + switch (res) + { + case MW_OK: + break; + case MW_IN_DB_ERROR: + warn_client(std::string("Did not find crash with UUID ") + pUUID + " in database"); + break; + case MW_PLUGIN_ERROR: + warn_client("Particular analyzer plugin isn't loaded or there is an error within plugin(s)"); + break; + case MW_CORRUPTED: + case MW_FILE_ERROR: + default: + warn_client(std::string("Corrupted crash with UUID ") + pUUID + ", deleting"); + std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); + DeleteDebugDumpDir(debugDumpDir); + break; + } + return crashReport; +} + typedef struct thread_data_t { pthread_t thread_id; char* UUID; char* UID; char* dest; } thread_data_t; -static void *create_report(void *arg) +static void* create_report(void* arg) { thread_data_t *thread_data = (thread_data_t *) arg; - map_crash_info_t crashReport; - g_pCommLayer->JobStarted(thread_data->dest, uint64_t(thread_data->thread_id)); + g_pCommLayer->JobStarted(thread_data->dest); - log("Creating report..."); try { - mw_result_t res; - res = CreateCrashReport(thread_data->UUID, thread_data->UID, crashReport); - switch (res) - { - case MW_OK: - break; - case MW_IN_DB_ERROR: - warn_client(std::string("Did not find crash with UUID ") + thread_data->UUID + " in database"); - break; - case MW_PLUGIN_ERROR: - warn_client(std::string("Particular analyzer plugin isn't loaded or there is an error within plugin(s)")); - break; - case MW_CORRUPTED: - case MW_FILE_ERROR: - default: - warn_client(std::string("Corrupted crash with UUID ") + thread_data->UUID + ", deleting"); - std::string debugDumpDir = DeleteCrashInfo(thread_data->UUID, thread_data->UID); - DeleteDebugDumpDir(debugDumpDir); - break; - } - /* only one thread can write */ - pthread_mutex_lock(&g_pJobsMutex); - g_pending_jobs[std::string(thread_data->UID)][uint64_t(thread_data->thread_id)] = crashReport; - pthread_mutex_unlock(&g_pJobsMutex); - - g_pCommLayer->JobDone(thread_data->dest, uint64_t(thread_data->thread_id)); + /* "GetJobResult" is a bit of a misnomer */ + log("Creating report..."); + map_crash_info_t crashReport = GetJobResult(thread_data->UUID, thread_data->UID); + g_pCommLayer->JobDone(thread_data->dest, thread_data->UUID); } catch (CABRTException& e) { @@ -167,13 +179,18 @@ static void *create_report(void *arg) /* Bogus value. pthreads require us to return void* */ return NULL; } -uint64_t CreateReport_t(const char* pUUID, const char* pUID, const char* pSender) +int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender) { thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t)); thread_data->UUID = xstrdup(pUUID); thread_data->UID = xstrdup(pUID); thread_data->dest = xstrdup(pSender); - if (pthread_create(&thread_data->thread_id, NULL, create_report, (void *)thread_data) != 0) +//TODO: do we need this? +//pthread_attr_t attr; +//pthread_attr_init(&attr); +//pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + int r = pthread_create(&thread_data->thread_id, NULL, create_report, thread_data); + if (r != 0) { free(thread_data->UUID); free(thread_data->UID); @@ -182,10 +199,14 @@ uint64_t CreateReport_t(const char* pUUID, const char* pUID, const char* pSender /* The only reason this may happen is system-wide resource starvation, * or ulimit is exceeded (someone floods us with CreateReport() dbus calls?) */ - error_msg("cannot create thread"); - return 0; + error_msg("Can't create thread"); + } + else + { + VERB3 log("Thread %llx created", (unsigned long long)thread_data->thread_id); } - return uint64_t(thread_data->thread_id); +//pthread_attr_destroy(&attr); + return r; } bool DeleteDebugDump(const std::string& pUUID, const std::string& pUID) @@ -208,12 +229,3 @@ bool DeleteDebugDump(const std::string& pUUID, const std::string& pUID) } return true; } - -map_crash_report_t GetJobResult(uint64_t pJobID, const std::string& pSender) -{ - /* FIXME: once we return the result, we should remove it from map to free memory - - use some TTL to clean the memory even if client won't get it - - if we don't find it in the cache we should try to ask MW to get it again?? - */ - return g_pending_jobs[pSender][pJobID]; -} diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h index f35e100..bd98d82 100644 --- a/src/Daemon/CrashWatcher.h +++ b/src/Daemon/CrashWatcher.h @@ -49,8 +49,8 @@ class CCrashWatcher }; vector_crash_infos_t GetCrashInfos(const std::string &pUID); -uint64_t CreateReport_t(const char* pUUID, const char* pUID, const char* pSender); +int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender); +map_crash_report_t GetJobResult(const char* pUUID, const char* pUID); bool DeleteDebugDump(const std::string& pUUID, const std::string& pUID); -map_crash_report_t GetJobResult(uint64_t pJobID, const std::string& pSender); #endif /*CRASHWATCHER_H_*/ diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index 149b2bd..f680471 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -53,7 +53,7 @@ * v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents" * - CreateReport(UUID): starts creating a report for /var/cache/abrt/DIR with this UUID * Returns job id (uint64) - * - GetJobResult(job_id): returns map_crash_report_t (map_vector_string_t) + * - GetJobResult(UUID): returns map_crash_report_t (map_vector_string_t) * - Report(map_crash_report_t (map_vector_string_t)): * "Please report this crash": calls Report() of all registered reporter plugins * Returns report_status_t (map_vector_string_t) - the status of each call @@ -98,12 +98,7 @@ static GMainLoop* g_pMainloop; int g_verbose; CCommLayerServer* g_pCommLayer; -/* - * Map to cache the results from CreateReport_t - * > - */ -std::map > g_pending_jobs; -/* mutex to protect g_pending_jobs */ + pthread_mutex_t g_pJobsMutex; diff --git a/src/Daemon/Daemon.h b/src/Daemon/Daemon.h index 8fcce71..e03d983 100644 --- a/src/Daemon/Daemon.h +++ b/src/Daemon/Daemon.h @@ -49,9 +49,6 @@ extern CPluginManager* g_pPluginManager; */ extern set_string_t g_setBlackList; -/* Map > to cache the results from CreateReport_t() */ -extern std::map > g_pending_jobs; -/* Mutex to protect g_pending_jobs */ extern pthread_mutex_t g_pJobsMutex; #endif diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index 8e09f6d..01e5196 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -149,6 +149,7 @@ class DBusManager(gobject.GObject): # new crash notify self.proxy.connect_to_signal("Crash",self.crash_cb,dbus_interface=CC_IFACE) # BT extracting complete +#TODO: remove, abrtd does not emit AnalyzeComplete self.acconnection = self.proxy.connect_to_signal("AnalyzeComplete",self.analyze_complete_cb,dbus_interface=CC_IFACE) # Catch Errors self.acconnection = self.proxy.connect_to_signal("Error",self.error_handler_cb,dbus_interface=CC_IFACE) @@ -173,7 +174,7 @@ class DBusManager(gobject.GObject): def jobdone_cb(self, dest, uuid): if self.uniq_name == dest: - print "Our job: %s is done." % uuid + print "Our job for UUID %s is done." % uuid dump = self.cc.GetJobResult(uuid) if dump: self.emit("analyze-complete", dump) -- cgit From f3f69b01bc53c21c8ce83dfbd97e05eb7beafc8e Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 13:35:45 +0200 Subject: Daemon.cpp: improve dbus API doc in comments. no code changes Signed-off-by: Denys Vlasenko --- src/Daemon/Daemon.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index f680471..a7c9737 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -51,8 +51,11 @@ * - GetCrashInfos(): returns a vector_crash_infos_t (vector_map_vector_string_t) * of crashes for given uid * v[N]["executable"/"uid"/"kernel"/"backtrace"][N] = "contents" - * - CreateReport(UUID): starts creating a report for /var/cache/abrt/DIR with this UUID - * Returns job id (uint64) + * - CreateReport(UUID): starts creating a report for /var/cache/abrt/DIR with this UUID. + * Returns job id (uint64). + * Emits JobStarted(client_dbus_ID,job_id) dbus signal. + * After it returns, when report creation thread has finished, + * JobDone(client_dbus_ID,UUID) dbus signal is emitted. * - GetJobResult(UUID): returns map_crash_report_t (map_vector_string_t) * - Report(map_crash_report_t (map_vector_string_t)): * "Please report this crash": calls Report() of all registered reporter plugins @@ -67,7 +70,20 @@ * - SetSettings(map_abrt_settings_t): returns void * * DBus signals we emit: - * - ... + * - Crash(progname,uid) - a new crash occurred (new /var/cache/abrt/DIR is found) + * - JobStarted(client_dbus_ID,job_id) - see CreateReport above. + * Sent as unicast to the client which did CreateReport. + * - JobDone(client_dbus_ID,UUID) - see CreateReport above. + * Sent as unicast to the client which did CreateReport. + * - Error(msg) + * - Warning(msg[,job_id]) + * - Update(msg,job_id) + * + * TODO: + * - Error/Warning/Update dbus signals must be unicast too + * - API does not really need JobStarted dbus signal at all, and JobDone signal + * does not need to pass any parameters - out clients never sent multiple + * CreateReport's. */ -- cgit From 08393f2509642009829f9de09a463e7d3e364a58 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 14:10:22 +0200 Subject: typo corrected Signed-off-by: Denys Vlasenko --- src/Daemon/CommLayerServerDBus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index 1be957b..d426338 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -455,7 +455,7 @@ static long get_remote_uid(DBusMessage* call, const char** ppSender = NULL) if (dbus_error_is_set(&err)) { dbus_error_free(&err); - error_msg("can't determine remore uid, assuming 0"); + error_msg("Can't determine remote uid, assuming 0"); return 0; } return uid; -- cgit From 8198cd06195f4217fd6b1afb675f3a316c951a1e Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 15:43:18 +0200 Subject: style fixes, trivial code changes only Signed-off-by: Denys Vlasenko --- src/Daemon/CrashWatcher.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index 1b147ed..5ad419b 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -116,6 +116,11 @@ map_crash_report_t GetJobResult(const char* pUUID, const char* pUID) { map_crash_info_t crashReport; + /* FIXME: starting from here, any shared data must be protected with a mutex. + * For example, CreateCrashReport does: + * g_pPluginManager->GetDatabase(g_settings_sDatabase); + * which is unsafe wrt concurrent updates to g_pPluginManager state. + */ mw_result_t res = CreateCrashReport(pUUID, pUID, crashReport); switch (res) { @@ -152,7 +157,7 @@ static void* create_report(void* arg) try { - /* "GetJobResult" is a bit of a misnomer */ + /* "GetJobResult" is a bit of a misnomer */ log("Creating report..."); map_crash_info_t crashReport = GetJobResult(thread_data->UUID, thread_data->UID); g_pCommLayer->JobDone(thread_data->dest, thread_data->UUID); @@ -213,8 +218,7 @@ bool DeleteDebugDump(const std::string& pUUID, const std::string& pUID) { try { - std::string debugDumpDir; - debugDumpDir = DeleteCrashInfo(pUUID, pUID); + std::string debugDumpDir = DeleteCrashInfo(pUUID, pUID); DeleteDebugDumpDir(debugDumpDir); } catch (CABRTException& e) -- cgit From ff2627e7c597e50025ca4d91ff8168eec80f9054 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Tue, 8 Sep 2009 17:05:57 +0200 Subject: make Warning, Error and Update send unicast dbus messages Signed-off-by: Denys Vlasenko --- src/Daemon/CommLayerServer.h | 7 ++--- src/Daemon/CommLayerServerDBus.cpp | 58 +++++++++++++++--------------------- src/Daemon/CommLayerServerDBus.h | 7 ++--- src/Daemon/CommLayerServerSocket.cpp | 2 +- src/Daemon/CommLayerServerSocket.h | 2 +- src/Daemon/CrashWatcher.cpp | 33 +++++++++++--------- src/Daemon/CrashWatcher.h | 4 +-- 7 files changed, 53 insertions(+), 60 deletions(-) (limited to 'src') diff --git a/src/Daemon/CommLayerServer.h b/src/Daemon/CommLayerServer.h index d2d2c4e..0b1027a 100644 --- a/src/Daemon/CommLayerServer.h +++ b/src/Daemon/CommLayerServer.h @@ -17,10 +17,9 @@ class CCommLayerServer { virtual void JobDone(const char* pDest, const char* pUUID) = 0; virtual void JobStarted(const char* pDest) {}; - virtual void Error(const std::string& arg1) {} - virtual void Update(const std::string& pMessage, uint64_t pJobID) {}; - virtual void Warning(const std::string& pMessage) {}; - virtual void Warning(const std::string& pMessage, uint64_t pJobID) {}; + virtual void Error(const std::string& pMessage, const char* peer) {} + virtual void Update(const std::string& pMessage, const char* peer, uint64_t pJobID) {}; + virtual void Warning(const std::string& pMessage, const char* peer, uint64_t pJobID) {}; }; #endif diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index d426338..c6908f5 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -336,12 +336,15 @@ static inline int load_val(DBusMessageIter* iter, std::map& val) { return */ /* helpers */ -static DBusMessage* new_signal_msg(const char* member) +static DBusMessage* new_signal_msg(const char* member, const char* peer = NULL) { /* path, interface, member name */ DBusMessage* msg = dbus_message_new_signal(CC_DBUS_PATH, CC_DBUS_IFACE, member); if (!msg) die_out_of_memory(); + /* Send unicast dbus signal if peer is known */ + if (peer && !dbus_message_set_destination(msg, peer)) + die_out_of_memory(); return msg; } static void send_flush_and_unref(DBusMessage* msg) @@ -367,74 +370,57 @@ void CCommLayerServerDBus::Crash(const std::string& progname, const std::string& send_flush_and_unref(msg); } -void CCommLayerServerDBus::JobStarted(const char* pDest) +void CCommLayerServerDBus::JobStarted(const char* peer) { - DBusMessage* msg = new_signal_msg("JobStarted"); - /* send unicast dbus signal */ - if (!dbus_message_set_destination(msg, pDest)) - die_out_of_memory(); + DBusMessage* msg = new_signal_msg("JobStarted", peer); uint64_t nJobID = uint64_t(pthread_self()); dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ + DBUS_TYPE_STRING, &peer, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_UINT64, &nJobID, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); - VERB2 log("Sending signal JobStarted('%s',%llx)", pDest, (unsigned long long)nJobID); + VERB2 log("Sending signal JobStarted('%s',%llx)", peer, (unsigned long long)nJobID); send_flush_and_unref(msg); } -void CCommLayerServerDBus::JobDone(const char* pDest, const char* pUUID) +void CCommLayerServerDBus::JobDone(const char* peer, const char* pUUID) { - DBusMessage* msg = new_signal_msg("JobDone"); - /* send unicast dbus signal */ - if (!dbus_message_set_destination(msg, pDest)) - die_out_of_memory(); + DBusMessage* msg = new_signal_msg("JobDone", peer); dbus_message_append_args(msg, - DBUS_TYPE_STRING, &pDest, /* TODO: redundant parameter, remove from API */ + DBUS_TYPE_STRING, &peer, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_STRING, &pUUID, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); - VERB2 log("Sending signal JobDone('%s','%s')", pDest, pUUID); + VERB2 log("Sending signal JobDone('%s','%s')", peer, pUUID); send_flush_and_unref(msg); } -void CCommLayerServerDBus::Error(const std::string& arg1) +void CCommLayerServerDBus::Error(const std::string& pMessage, const char* peer) { - DBusMessage* msg = new_signal_msg("Error"); - const char* c_arg1 = arg1.c_str(); - dbus_message_append_args(msg, - DBUS_TYPE_STRING, &c_arg1, - DBUS_TYPE_INVALID); - send_flush_and_unref(msg); -} - -void CCommLayerServerDBus::Update(const std::string& pMessage, uint64_t job_id) -{ - DBusMessage* msg = new_signal_msg("Update"); + DBusMessage* msg = new_signal_msg("Error", peer); const char* c_message = pMessage.c_str(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_message, - DBUS_TYPE_UINT64, &job_id, DBUS_TYPE_INVALID); send_flush_and_unref(msg); } -/* TODO: one Warning()? */ -void CCommLayerServerDBus::Warning(const std::string& pMessage) +void CCommLayerServerDBus::Update(const std::string& pMessage, const char* peer, uint64_t job_id) { - DBusMessage* msg = new_signal_msg("Warning"); + DBusMessage* msg = new_signal_msg("Update", peer); const char* c_message = pMessage.c_str(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_message, + DBUS_TYPE_UINT64, &job_id, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); send_flush_and_unref(msg); } -void CCommLayerServerDBus::Warning(const std::string& pMessage, uint64_t job_id) +void CCommLayerServerDBus::Warning(const std::string& pMessage, const char* peer, uint64_t job_id) { - DBusMessage* msg = new_signal_msg("Warning"); + DBusMessage* msg = new_signal_msg("Warning", peer); const char* c_message = pMessage.c_str(); dbus_message_append_args(msg, DBUS_TYPE_STRING, &c_message, - DBUS_TYPE_UINT64, &job_id, + DBUS_TYPE_UINT64, &job_id, /* TODO: redundant parameter, remove from API */ DBUS_TYPE_INVALID); send_flush_and_unref(msg); } @@ -885,6 +871,8 @@ static DBusHandlerResult message_received(DBusConnection *conn, DBusMessage *msg const char* member = dbus_message_get_member(msg); log("%s(method:'%s')", __func__, member); + set_client_name(dbus_message_get_sender(msg)); + DBusMessage* reply = dbus_message_new_method_return(msg); int r = -1; if (strcmp(member, "GetCrashInfos") == 0) @@ -931,6 +919,8 @@ static DBusHandlerResult message_received(DBusConnection *conn, DBusMessage *msg } } + set_client_name(NULL); + return DBUS_HANDLER_RESULT_HANDLED; } /* Callback: "DBusObjectPathVTable is unregistered (or its connection is freed)" */ diff --git a/src/Daemon/CommLayerServerDBus.h b/src/Daemon/CommLayerServerDBus.h index 979823d..3a8822d 100644 --- a/src/Daemon/CommLayerServerDBus.h +++ b/src/Daemon/CommLayerServerDBus.h @@ -15,10 +15,9 @@ class CCommLayerServerDBus virtual void JobStarted(const char* pDest); virtual void JobDone(const char* pDest, const char* pUUID); - virtual void Error(const std::string& arg1); - virtual void Update(const std::string& pMessage, uint64_t pJobID); - virtual void Warning(const std::string& pMessage); - virtual void Warning(const std::string& pMessage, uint64_t pJobID); + virtual void Error(const std::string& pMessage, const char* peer); + virtual void Update(const std::string& pMessage, const char* peer, uint64_t pJobID); + virtual void Warning(const std::string& pMessage, const char* peer, uint64_t pJobID); }; #endif diff --git a/src/Daemon/CommLayerServerSocket.cpp b/src/Daemon/CommLayerServerSocket.cpp index a3240a8..8f1fd4f 100644 --- a/src/Daemon/CommLayerServerSocket.cpp +++ b/src/Daemon/CommLayerServerSocket.cpp @@ -246,7 +246,7 @@ void CCommLayerServerSocket::Crash(const std::string& arg1) //Send("(CRASH)New Crash Detected: " + arg1); } -void CCommLayerServerSocket::Error(const std::string& arg1) +void CCommLayerServerSocket::Error(const std::string& arg1, const char* peer) { //Send("(ERROR)Error: " + arg1); } diff --git a/src/Daemon/CommLayerServerSocket.h b/src/Daemon/CommLayerServerSocket.h index 9d4f21c..0ee4701 100644 --- a/src/Daemon/CommLayerServerSocket.h +++ b/src/Daemon/CommLayerServerSocket.h @@ -33,5 +33,5 @@ class CCommLayerServerSocket : public CCommLayerServer virtual void Crash(const std::string& arg1); virtual void JobStarted(const char* pDest) {}; - virtual void Error(const std::string& arg1); + virtual void Error(const std::string& arg1, const char* peer); }; diff --git a/src/Daemon/CrashWatcher.cpp b/src/Daemon/CrashWatcher.cpp index 5ad419b..6c4d654 100644 --- a/src/Daemon/CrashWatcher.cpp +++ b/src/Daemon/CrashWatcher.cpp @@ -24,19 +24,18 @@ #include "ABRTException.h" #include "CrashWatcher.h" -void CCrashWatcher::Status(const std::string& pMessage, uint64_t pJobID) +void CCrashWatcher::Status(const std::string& pMessage, const char* peer, uint64_t pJobID) { - log("Update: %s", pMessage.c_str()); - //FIXME: send updates only to job owner + VERB1 log("Update('%s'): %s", peer, pMessage.c_str()); if (g_pCommLayer != NULL) - g_pCommLayer->Update(pMessage, pJobID); + g_pCommLayer->Update(pMessage, peer, pJobID); } -void CCrashWatcher::Warning(const std::string& pMessage, uint64_t pJobID) +void CCrashWatcher::Warning(const std::string& pMessage, const char* peer, uint64_t pJobID) { - log("Warning: %s", pMessage.c_str()); + VERB1 log("Warning('%s'): %s", peer, pMessage.c_str()); if (g_pCommLayer != NULL) - g_pCommLayer->Warning(pMessage, pJobID); + g_pCommLayer->Warning(pMessage, peer, pJobID); } CCrashWatcher::CCrashWatcher() @@ -147,38 +146,44 @@ typedef struct thread_data_t { pthread_t thread_id; char* UUID; char* UID; - char* dest; + char* peer; } thread_data_t; static void* create_report(void* arg) { thread_data_t *thread_data = (thread_data_t *) arg; - g_pCommLayer->JobStarted(thread_data->dest); + g_pCommLayer->JobStarted(thread_data->peer); + + /* Client name is per-thread, need to set it */ + set_client_name(thread_data->peer); try { /* "GetJobResult" is a bit of a misnomer */ log("Creating report..."); map_crash_info_t crashReport = GetJobResult(thread_data->UUID, thread_data->UID); - g_pCommLayer->JobDone(thread_data->dest, thread_data->UUID); + g_pCommLayer->JobDone(thread_data->peer, thread_data->UUID); } catch (CABRTException& e) { if (e.type() == EXCEP_FATAL) { + set_client_name(NULL); /* free strduped strings */ free(thread_data->UUID); free(thread_data->UID); - free(thread_data->dest); + free(thread_data->peer); free(thread_data); throw e; } warn_client(e.what()); } + set_client_name(NULL); + /* free strduped strings */ free(thread_data->UUID); free(thread_data->UID); - free(thread_data->dest); + free(thread_data->peer); free(thread_data); /* Bogus value. pthreads require us to return void* */ @@ -189,7 +194,7 @@ int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender) thread_data_t *thread_data = (thread_data_t *)xzalloc(sizeof(thread_data_t)); thread_data->UUID = xstrdup(pUUID); thread_data->UID = xstrdup(pUID); - thread_data->dest = xstrdup(pSender); + thread_data->peer = xstrdup(pSender); //TODO: do we need this? //pthread_attr_t attr; //pthread_attr_init(&attr); @@ -199,7 +204,7 @@ int CreateReportThread(const char* pUUID, const char* pUID, const char* pSender) { free(thread_data->UUID); free(thread_data->UID); - free(thread_data->dest); + free(thread_data->peer); free(thread_data); /* The only reason this may happen is system-wide resource starvation, * or ulimit is exceeded (someone floods us with CreateReport() dbus calls?) diff --git a/src/Daemon/CrashWatcher.h b/src/Daemon/CrashWatcher.h index bd98d82..00bb4d5 100644 --- a/src/Daemon/CrashWatcher.h +++ b/src/Daemon/CrashWatcher.h @@ -44,8 +44,8 @@ class CCrashWatcher public: /* Observer methods */ - virtual void Status(const std::string& pMessage, uint64_t pJobID=0); - virtual void Warning(const std::string& pMessage, uint64_t pJobID=0); + virtual void Status(const std::string& pMessage, const char* peer, uint64_t pJobID); + virtual void Warning(const std::string& pMessage, const char* peer, uint64_t pJobID); }; vector_crash_infos_t GetCrashInfos(const std::string &pUID); -- cgit