From 2ac545dec6ee4359e3f1f53b7f705cd2c2c0d26e Mon Sep 17 00:00:00 2001 From: Andrew Resch Date: Mon, 27 Apr 2009 18:50:41 +0000 Subject: [PATCH] Clean-up signal handling since twisted.reactor handles it now --- deluge/core/daemon.py | 14 +++++----- deluge/ui/gtkui/gtkui.py | 7 ++--- deluge/ui/web/server.py | 56 +++++++++++++++++++--------------------- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/deluge/core/daemon.py b/deluge/core/daemon.py index 5a5a19df0..50caae9e3 100644 --- a/deluge/core/daemon.py +++ b/deluge/core/daemon.py @@ -22,8 +22,6 @@ # Boston, MA 02110-1301, USA. # -import signal - import gettext import locale import pkg_resources @@ -51,12 +49,12 @@ class Daemon(object): except Exception, e: log.error("Unable to initialize gettext/locale: %s", e) - # Setup signals - signal.signal(signal.SIGINT, self.shutdown) - signal.signal(signal.SIGTERM, self.shutdown) - if not deluge.common.windows_check(): - signal.signal(signal.SIGHUP, self.shutdown) - else: + # Twisted catches signals to terminate, so just have it call the shutdown + # method. + reactor.addSystemEventTrigger("after", "shutdown", self.shutdown) + + # Catch some Windows specific signals + if deluge.common.windows_check(): from win32api import SetConsoleCtrlHandler from win32con import CTRL_CLOSE_EVENT from win32con import CTRL_SHUTDOWN_EVENT diff --git a/deluge/ui/gtkui/gtkui.py b/deluge/ui/gtkui/gtkui.py index 22c27882d..55c2df7c8 100644 --- a/deluge/ui/gtkui/gtkui.py +++ b/deluge/ui/gtkui/gtkui.py @@ -33,7 +33,6 @@ import gobject import gettext import locale import pkg_resources -import signal import gtk, gtk.glade import deluge.component as component @@ -132,8 +131,10 @@ class GtkUI: self.gnome_client.connect("die", self.shutdown) except: pass - signal.signal(signal.SIGINT, self.shutdown) - signal.signal(signal.SIGTERM, self.shutdown) + + # Twisted catches signals to terminate, so just have it call the shutdown + # method. + reactor.addSystemEventTrigger("after", "shutdown", self.shutdown) if deluge.common.windows_check(): from win32api import SetConsoleCtrlHandler diff --git a/deluge/ui/web/server.py b/deluge/ui/web/server.py index 790030110..c96305055 100644 --- a/deluge/ui/web/server.py +++ b/deluge/ui/web/server.py @@ -26,8 +26,6 @@ import os import time import locale import shutil -import signal -import signal import urllib import gettext import hashlib @@ -92,7 +90,7 @@ class Config(resource.Resource): Writes out a javascript file that contains the WebUI configuration available as Deluge.Config. """ - + def render(self, request): return """Deluge = { author: 'Damien Churchill ', @@ -110,22 +108,22 @@ class Upload(resource.Resource): """ Twisted Web resource to handle file uploads """ - + def render(self, request): """ Saves all uploaded files to the disk and returns a list of filenames, each on a new line. """ - + # Block all other HTTP methods. if request.method != "POST": request.setResponseCode(http.NOT_ALLOWED) return "" - + if "file" not in request.args: request.setResponseCode(http.OK) return "" - + tempdir = os.path.join(tempfile.gettempdir(), "delugeweb") if not os.path.isdir(tempdir): os.mkdir(tempdir) @@ -145,7 +143,7 @@ class Render(resource.Resource): def getChild(self, path, request): request.render_file = path return self - + def render(self, request): if not hasattr(request, "render_file"): request.setResponseCode(http.INTERNAL_SERVER_ERROR) @@ -159,11 +157,11 @@ class Render(resource.Resource): class Tracker(resource.Resource): tracker_icons = TrackerIcons() - + def getChild(self, path, request): request.tracker_name = path return self - + def render(self, request): headers = {} filename = self.tracker_icons.get(request.tracker_name) @@ -185,7 +183,7 @@ class Flag(resource.Resource): def getChild(self, path, request): request.country = path return self - + def render(self, request): headers = {} path = ("data", "pixmaps", "flags", request.country.lower() + ".png") @@ -203,20 +201,20 @@ class Flag(resource.Resource): return "" class LookupResource(resource.Resource, component.Component): - - def __init__(self, name, *directories): + + def __init__(self, name, *directories): resource.Resource.__init__(self) component.Component.__init__(self, name) self.__directories = directories - + @property def directories(self): return self.__directories - + def getChild(self, path, request): request.path = path return self - + def render(self, request): log.debug("Requested path: '%s'", request.path) for lookup in self.directories: @@ -231,13 +229,13 @@ class LookupResource(resource.Resource, component.Component): class TopLevel(resource.Resource): addSlash = True - + __stylesheets = [ "/css/ext-all.css", "/css/ext-extensions.css", "/css/deluge.css" ] - + __scripts = [ "/js/ext-base.js", "/js/ext-all.js", @@ -246,7 +244,7 @@ class TopLevel(resource.Resource): "/gettext.js", "/js/deluge-yc.js" ] - + __debug_scripts = [ "/js/ext-base.js", "/js/ext-all-debug.js", @@ -288,7 +286,7 @@ class TopLevel(resource.Resource): "/js/Deluge.Torrents.js", "/js/Deluge.UI.js" ] - + def __init__(self): resource.Resource.__init__(self) self.putChild("config.js", Config()) @@ -303,22 +301,22 @@ class TopLevel(resource.Resource): self.putChild("render", Render()) self.putChild("themes", static.File(rpath("themes"))) self.putChild("tracker", Tracker()) - + theme = component.get("DelugeWeb").config["theme"] self.__stylesheets.append("/css/xtheme-%s.css" % theme) @property def scripts(self): return self.__scripts - + @property def debug_scripts(self): return self.__debug_scripts - + @property def stylesheets(self): return self.__stylesheets - + def getChild(self, path, request): if path == "": return self @@ -330,22 +328,22 @@ class TopLevel(resource.Resource): scripts = self.debug_scripts[:] else: scripts = self.scripts[:] - + template = Template(filename=rpath("index.html")) request.setHeader("content-type", "text/html; charset=utf-8") return template.render(scripts=scripts, stylesheets=self.stylesheets) class DelugeWeb(component.Component): - + def __init__(self): super(DelugeWeb, self).__init__("DelugeWeb") self.config = ConfigManager("web.conf", CONFIG_DEFAULTS) - + self.top_level = TopLevel() self.site = server.Site(self.top_level) self.port = self.config["port"] self.web_api = WebApi() - + # Since twisted assigns itself all the signals may as well make # use of it. reactor.addSystemEventTrigger("after", "shutdown", self.shutdown) @@ -362,7 +360,7 @@ class DelugeWeb(component.Component): self.shutdown() return 1 SetConsoleCtrlHandler(win_handler) - + # Initalize the plugins self.plugins = PluginManager()