summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcinderblock <>2011-02-04 19:43:27 +0000
committerDamien Churchill <damoxc@gmail.com>2011-02-04 19:43:27 +0000
commit9a54beef78d8fbfc0eb55162541b6ca908879007 (patch)
treee9b60a8bedd176bbcb7aea68bdac7e97da424350
parentb0a0574ae092c9587024a933438ad99dbd30a63f (diff)
downloaddeluge-9a54beef78d8fbfc0eb55162541b6ca908879007.tar.gz
deluge-9a54beef78d8fbfc0eb55162541b6ca908879007.tar.bz2
deluge-9a54beef78d8fbfc0eb55162541b6ca908879007.zip
add patch from #1473
-rw-r--r--deluge/main.py52
-rw-r--r--deluge/ui/web/web.py35
2 files changed, 62 insertions, 25 deletions
diff --git a/deluge/main.py b/deluge/main.py
index dfb489d59..b52988da6 100644
--- a/deluge/main.py
+++ b/deluge/main.py
@@ -149,14 +149,20 @@ this should be an IP address", metavar="IFACE",
parser.add_option("-u", "--ui-interface", dest="ui_interface",
help="Interface daemon will listen for UI connections on, this should be\
an IP address", metavar="IFACE", action="store", type="str")
- parser.add_option("-d", "--do-not-daemonize", dest="donot",
- help="Do not daemonize", action="store_true", default=False)
+ if not (deluge.common.windows_check() or deluge.common.osx_check()):
+ parser.add_option("-d", "--do-not-daemonize", dest="donot",
+ help="Do not daemonize", action="store_true", default=False)
parser.add_option("-c", "--config", dest="config",
help="Set the config location", action="store", type="str")
parser.add_option("-l", "--logfile", dest="logfile",
help="Set the logfile location", action="store", type="str")
parser.add_option("-P", "--pidfile", dest="pidfile",
help="Use pidfile to store process id", action="store", type="str")
+ if not deluge.common.windows_check():
+ parser.add_option("-U", "--user", dest="user",
+ help="User to switch to. Only use it when starting as root", action="store", type="str")
+ parser.add_option("-g", "--group", dest="group",
+ help="Group to switch to. Only use it when starting as root", action="store", type="str")
parser.add_option("-L", "--loglevel", dest="loglevel",
help="Set the log level: none, info, warning, error, critical, debug", action="store", type="str")
parser.add_option("-q", "--quiet", dest="quiet",
@@ -197,24 +203,30 @@ this should be an IP address", metavar="IFACE",
open(options.pidfile, "wb").write("%s\n" % os.getpid())
# If the donot daemonize is set, then we just skip the forking
- if not options.donot:
- # Windows check, we log to the config folder by default
- if deluge.common.windows_check() or deluge.common.osx_check():
- open_logfile()
- write_pidfile()
- else:
- if os.fork() == 0:
- os.setsid()
- if os.fork() == 0:
- open_logfile()
- write_pidfile()
- else:
- os._exit(0)
- else:
- os._exit(0)
- else:
- # Do not daemonize
- write_pidfile()
+ if not (deluge.common.windows_check() or deluge.common.osx_check() or options.donot):
+ if os.fork():
+ # We've forked and this is now the parent process, so die!
+ os._exit(0)
+ os.setsid()
+ # Do second fork
+ if os.fork():
+ os._exit(0)
+
+ # Write pid file before chuid
+ write_pidfile()
+
+ if options.user:
+ if not options.user.isdigit():
+ import pwd
+ options.user = pwd.getpwnam(options.user)[2]
+ os.setuid(options.user)
+ if options.group:
+ if not options.group.isdigit():
+ import grp
+ options.group = grp.getgrnam(options.group)[2]
+ os.setuid(options.group)
+
+ open_logfile()
# Setup the logger
try:
diff --git a/deluge/ui/web/web.py b/deluge/ui/web/web.py
index a2b57655a..23cabcdd7 100644
--- a/deluge/ui/web/web.py
+++ b/deluge/ui/web/web.py
@@ -56,9 +56,20 @@ class Web(_UI):
group.add_option("-b", "--base", dest="base",
help="Set the base path that the ui is running on (proxying)",
action="store", default=None)
- group.add_option("-f", "--fork", dest="fork",
- help="Fork the web interface process into the background",
- action="store_true", default=False)
+ if not (deluge.common.windows_check() or deluge.common.osx_check()):
+ group.add_option("-f", "--fork", dest="fork",
+ help="Fork the web interface process into the background",
+ action="store_true", default=False)
+ group.add_option("-P", "--pidfile", dest="pidfile", type="str",
+ help="Use pidfile to store process id",
+ action="store", default=None)
+ if not deluge.common.windows_check():
+ group.add_option("-U", "--user", dest="user", type="str",
+ help="User to switch to. Only use it when starting as root",
+ action="store", default=None)
+ group.add_option("-g", "--group", dest="group", type="str",
+ help="Group to switch to. Only use it when starting as root",
+ action="store", default=None)
group.add_option("-p", "--port", dest="port", type="int",
help="Sets the port to be used for the webserver",
action="store", default=None)
@@ -86,7 +97,7 @@ class Web(_UI):
import deluge.common
# Steps taken from http://www.faqs.org/faqs/unix-faq/programmer/faq/
# Section 1.7
- if self.options.fork and not deluge.common.windows_check():
+ if self.options.fork:
# fork() so the parent can exit, returns control to the command line
# or shell invoking the program.
if os.fork():
@@ -103,7 +114,21 @@ class Web(_UI):
# use that may prevent a filesystem unmount.
import deluge.configmanager
os.chdir(deluge.configmanager.get_config_dir())
-
+
+ if self.options.pidfile:
+ open(self.options.pidfile, "wb").write("%d\n" % os.getpid())
+
+ if self.options.group:
+ if not self.options.group.isdigit():
+ import grp
+ self.options.group = grp.getgrnam(self.options.group)[2]
+ os.setuid(self.options.group)
+ if self.options.user:
+ if not self.options.user.isdigit():
+ import pwd
+ self.options.user = pwd.getpwnam(self.options.user)[2]
+ os.setuid(self.options.user)
+
import server
self.__server = server.DelugeWeb()