daemon code and comment cleanup, removed double call to _shutdown

This commit is contained in:
Calum Lind 2013-05-18 23:34:39 +01:00
parent 02bc00bfa5
commit 35c85c6d1d

View File

@ -35,31 +35,28 @@
import os import os
import logging import logging
from twisted.internet import reactor from twisted.internet import reactor
import twisted.internet.error
import deluge.component as component import deluge.component as component
import deluge.configmanager import deluge.configmanager
import deluge.common import deluge.common
from deluge.core.rpcserver import RPCServer, export from deluge.core.rpcserver import RPCServer, export
import deluge.error from deluge.error import DaemonRunningError
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Daemon(object): class Daemon(object):
def __init__(self, options=None, args=None, classic=False): def __init__(self, options=None, args=None, classic=False):
# Check for another running instance of the daemon # Check for another running instance of the daemon
if os.path.isfile(deluge.configmanager.get_config_dir("deluged.pid")): pid_file = deluge.configmanager.get_config_dir("deluged.pid")
if os.path.isfile(pid_file):
# Get the PID and the port of the supposedly running daemon # Get the PID and the port of the supposedly running daemon
with open(pid_file) as _file:
(pid, port) = _file.readline().strip().split(";")
try: try:
(pid, port) = open( pid, port = int(pid), int(port)
deluge.configmanager.get_config_dir("deluged.pid")
).read().strip().split(";")
pid = int(pid)
port = int(port)
except ValueError: except ValueError:
pid = None pid, port = None, None
port = None
def process_running(pid): def process_running(pid):
if deluge.common.windows_check(): if deluge.common.windows_check():
@ -75,32 +72,27 @@ class Daemon(object):
return True return True
if pid is not None and process_running(pid): if pid is not None and process_running(pid):
# Ok, so a process is running with this PID, let's make doubly-sure # Ensure it's a deluged process by trying to open a socket to it's port.
# it's a deluged process by trying to open a socket to it's port.
import socket import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) _socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try: try:
s.connect(("127.0.0.1", port)) _socket.connect(("127.0.0.1", port))
except socket.error: except socket.error:
# Can't connect, so it must not be a deluged process.. # Can't connect, so it must not be a deluged process..
pass pass
else: else:
# This is a deluged! # This is a deluged!
s.close() _socket.close()
raise deluge.error.DaemonRunningError( raise DaemonRunningError("Deluge daemon already running with this config directory!")
"There is a deluge daemon running with this config "
"directory!"
)
# Twisted catches signals to terminate, so just have it call the shutdown # Twisted catches signals to terminate, so just have it call the shutdown method.
# method.
reactor.addSystemEventTrigger("before", "shutdown", self._shutdown) reactor.addSystemEventTrigger("before", "shutdown", self._shutdown)
# Catch some Windows specific signals # Catch some Windows specific signals
if deluge.common.windows_check(): if deluge.common.windows_check():
from win32api import SetConsoleCtrlHandler from win32api import SetConsoleCtrlHandler
from win32con import CTRL_CLOSE_EVENT from win32con import CTRL_CLOSE_EVENT, CTRL_SHUTDOWN_EVENT
from win32con import CTRL_SHUTDOWN_EVENT
def win_handler(ctrl_type): def win_handler(ctrl_type):
log.debug("ctrl_type: %s", ctrl_type) log.debug("ctrl_type: %s", ctrl_type)
if ctrl_type == CTRL_CLOSE_EVENT or ctrl_type == CTRL_SHUTDOWN_EVENT: if ctrl_type == CTRL_CLOSE_EVENT or ctrl_type == CTRL_SHUTDOWN_EVENT:
@ -145,35 +137,33 @@ class Daemon(object):
self.rpcserver.register_object(self.core) self.rpcserver.register_object(self.core)
self.rpcserver.register_object(self) self.rpcserver.register_object(self)
# Make sure we start the PreferencesManager first # Make sure we start the PreferencesManager first
component.start("PreferencesManager") component.start("PreferencesManager")
if not classic: if not classic:
# Write out a pid file all the time, we use this to see if a deluged is running # Create pid file to track if deluged is running, also includes the port number.
# We also include the running port number to do an additional test log.debug("Creating pid file: %s", pid_file)
open(deluge.configmanager.get_config_dir("deluged.pid"), "wb").write( open(pid_file, "wb").write("%s;%s\n" % (os.getpid(), port))
"%s;%s\n" % (os.getpid(), port))
component.start() component.start()
try: try:
log.info("Deluge daemon starting...")
reactor.run() reactor.run()
finally: finally:
self._shutdown() try:
log.debug("Removing pid file: %s", pid_file)
os.remove(pid_file)
except OSError, ex:
log.error("Error removing pid file: %s", ex)
log.info("Deluge daemon shutdown successfully")
@export() @export()
def shutdown(self, *args, **kwargs): def shutdown(self, *args, **kwargs):
log.debug("Delgue daemon shutdown requested...")
reactor.callLater(0, reactor.stop) reactor.callLater(0, reactor.stop)
def _shutdown(self, *args, **kwargs): def _shutdown(self, *args, **kwargs):
if os.path.exists(deluge.configmanager.get_config_dir("deluged.pid")): log.info("Deluge daemon shutting down, waiting for components to shutdown...")
try:
os.remove(deluge.configmanager.get_config_dir("deluged.pid"))
except Exception, e:
log.exception(e)
log.error("Error removing deluged.pid!")
log.info("Waiting for components to shutdown..")
d = component.shutdown() d = component.shutdown()
return d return d