diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-07 14:53:08 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-10-07 14:53:08 +0200 |
commit | d4d523f17caf7176a620b90d064f2386898de552 (patch) | |
tree | 904118ce34968b4116af1edafffea532051b048c /src/Gui/CCDBusBackend.py | |
parent | f23058b3dd64a35892df4a7e2e96441d4ec0c5ca (diff) | |
download | abrt-d4d523f17caf7176a620b90d064f2386898de552.tar.gz abrt-d4d523f17caf7176a620b90d064f2386898de552.tar.xz abrt-d4d523f17caf7176a620b90d064f2386898de552.zip |
abrt-gui: make it safe wrt abrtd restarts
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'src/Gui/CCDBusBackend.py')
-rw-r--r-- | src/Gui/CCDBusBackend.py | 92 |
1 files changed, 39 insertions, 53 deletions
diff --git a/src/Gui/CCDBusBackend.py b/src/Gui/CCDBusBackend.py index f1ab4435..dfb405e3 100644 --- a/src/Gui/CCDBusBackend.py +++ b/src/Gui/CCDBusBackend.py @@ -61,7 +61,6 @@ class DBusManager(gobject.GObject): gobject.signal_new("update", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) # signal emited to show gui if user try to run it again gobject.signal_new("show", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ()) - # signal emited to show gui if user try to run it again gobject.signal_new("daemon-state-changed", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) gobject.signal_new("report-done", self, gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)) @@ -70,7 +69,9 @@ class DBusManager(gobject.GObject): session.request_name(APP_NAME) iface = DBusInterface(self) - self.connect_to_daemon() + self.bus = dbus.SystemBus() + if not self.bus: + raise Exception(_("Can't connect to system dbus")) self.bus.add_signal_receiver(self.owner_changed_cb, "NameOwnerChanged", dbus_interface="org.freedesktop.DBus") # new crash notification self.bus.add_signal_receiver(self.crash_cb, "Crash", dbus_interface=CC_IFACE) @@ -81,9 +82,30 @@ class DBusManager(gobject.GObject): # watch for job-done signals self.bus.add_signal_receiver(self.jobdone_cb, "JobDone", dbus_interface=CC_IFACE) - # disconnect callback - def disconnected(self, *args): - print "disconnect" + # We use this function instead of caching and reusing of + # dbus.Interface(proxy, dbus_interface=CC_IFACE) because we want + # to restart abrtd in this scenario: + # (1) abrt-gui was run + # (2) user generated the report, then left for coffee break + # (3) abrtd exited on inactivity timeout + # (4) user returned and wants to submit the report + # for (4) to restart abrtd, we must recreate proxy and daemon + def daemon(self): + if not self.bus: + self.bus = dbus.SystemBus() + if not self.bus: + raise Exception(_("Can't connect to system dbus")) + proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False) + if not proxy: + raise Exception(_("Please check if abrt daemon is running")) + daemon = dbus.Interface(proxy, dbus_interface=CC_IFACE) + if not daemon: + raise Exception(_("Please check if abrt daemon is running")) + return daemon + +# # disconnect callback +# def disconnected(self, *args): +# print "disconnect" def error_handler_cb(self,error): self.emit("abrt-error",error) @@ -115,43 +137,18 @@ class DBusManager(gobject.GObject): print "Warning >>%s<<" % message self.emit("warning", message) -# Seems to be not needed at all. Not only that, it is actively harmful -# when abrtd is autostarted by dbus-daemon: connect_to_daemon() would install -# duplicate signal handlers! def owner_changed_cb(self,name, old_owner, new_owner): if name == CC_NAME: - # No need to connect at once, we can do it when we need it - # (and this "connect on demand" mode of operation is needed - # anyway if abrtd is autostarted by dbus: before we call it, - # there is no abrtd to connect to!) if new_owner: - #self.proxy = self.connect_to_daemon() self.emit("daemon-state-changed", "up") else: - #self.proxy = None self.emit("daemon-state-changed", "down") - def connect_to_daemon(self): - if not self.bus: - self.bus = dbus.SystemBus() - if not self.bus: - raise Exception(_("Can't connect to dbus")) - # Can't do this: abrtd may be autostarted by dbus-daemon - #if self.bus.name_has_owner(CC_NAME): - # self.proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False) - #else: - # raise Exception(_("Please check if abrt daemon is running.")) - self.proxy = self.bus.get_object(CC_IFACE, CC_PATH, introspect=False) - if self.proxy: - self.cc = dbus.Interface(self.proxy, dbus_interface=CC_IFACE) - else: - raise Exception(_("Please check if abrt daemon is running.")) - def jobdone_cb(self, dest, uuid): # TODO: check that it is indeed OUR job: # remember uuid in getReport and compare here print "Our job for UUID %s is done." % uuid - dump = self.cc.GetJobResult(uuid) + dump = self.daemon().GetJobResult(uuid) if dump: self.emit("analyze-complete", dump) else: @@ -161,31 +158,20 @@ class DBusManager(gobject.GObject): self.emit("report-done", result) def getReport(self, UUID): - try: - # let's try it async - # even if it's async it timeouts, so let's try to set the timeout to 60sec - #self.cc.CreateReport(UUID, reply_handler=self.addJob, error_handler=self.error_handler, timeout=60) - # we don't need the return value, as the job_id is sent via JobStarted signal - self.cc.CreateReport(UUID, timeout=60) - except dbus.exceptions.DBusException, e: - # One case when it fails is if abrtd exited and needs to be - # autostarted by dbus again. (This is a first stab - # at making it work in this case, I want to find a better way) - self.connect_to_daemon() - self.cc.CreateReport(UUID, timeout=60) + self.daemon().CreateReport(UUID, timeout=60) def Report(self, report, reporters_settings = None): # map < Plguin_name vec <status, message> > - self.cc.Report(report, reporters_settings, reply_handler=self.report_done, error_handler=self.error_handler_cb, timeout=60) + self.daemon().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) + return self.daemon().DeleteDebugDump(UUID) def getDumps(self): row_dict = None rows = [] # FIXME check the arguments - for row in self.cc.GetCrashInfos(): + for row in self.daemon().GetCrashInfos(): row_dict = {} for column in row: row_dict[column] = row[column] @@ -193,28 +179,28 @@ class DBusManager(gobject.GObject): return rows def getPluginsInfo(self): - return self.cc.GetPluginsInfo() + return self.daemon().GetPluginsInfo() def getPluginSettings(self, plugin_name): - settings = self.cc.GetPluginSettings(plugin_name) + settings = self.daemon().GetPluginSettings(plugin_name) #for i in settings.keys(): # print i return settings def registerPlugin(self, plugin_name): - return self.cc.RegisterPlugin(plugin_name) + return self.daemon().RegisterPlugin(plugin_name) def unRegisterPlugin(self, plugin_name): - return self.cc.UnRegisterPlugin(plugin_name) + return self.daemon().UnRegisterPlugin(plugin_name) def setPluginSettings(self, plugin_name, plugin_settings): - return self.cc.SetPluginSettings(plugin_name, plugin_settings) + return self.daemon().SetPluginSettings(plugin_name, plugin_settings) def getSettings(self): - return self.cc.GetSettings() + return self.daemon().GetSettings() def setSettings(self, settings): # FIXME: STUB!!!! print "setSettings stub" - retval = self.cc.SetSettings(self.cc.GetSettings()) + retval = self.daemon().SetSettings(self.daemon().GetSettings()) print ">>>", retval |