equal
deleted
inserted
replaced
14 from datetime import date, timedelta |
14 from datetime import date, timedelta |
15 from urlparse import urlsplit, urlunsplit |
15 from urlparse import urlsplit, urlunsplit |
16 import hotshot |
16 import hotshot |
17 |
17 |
18 from twisted.application import service, strports |
18 from twisted.application import service, strports |
19 from twisted.scripts._twistd_unix import daemonize |
|
20 from twisted.internet import reactor, task, threads |
19 from twisted.internet import reactor, task, threads |
21 from twisted.internet.defer import maybeDeferred |
20 from twisted.internet.defer import maybeDeferred |
22 from twisted.web2 import channel, http, server, iweb |
21 from twisted.web2 import channel, http, server, iweb |
23 from twisted.web2 import static, resource, responsecode |
22 from twisted.web2 import static, resource, responsecode |
24 |
23 |
28 ExplicitLogin) |
27 ExplicitLogin) |
29 from cubicweb.web.application import CubicWebPublisher |
28 from cubicweb.web.application import CubicWebPublisher |
30 |
29 |
31 from cubicweb.etwist.request import CubicWebTwistedRequestAdapter |
30 from cubicweb.etwist.request import CubicWebTwistedRequestAdapter |
32 |
31 |
|
32 def daemonize(uid): |
|
33 # XXX unix specific |
|
34 # XXX factorize w/ code in cw.server.server and cw.server.serverctl |
|
35 # (start-repository command) |
|
36 if uid is not None: |
|
37 try: |
|
38 uid = int(uid) |
|
39 except ValueError: |
|
40 from pwd import getpwnam |
|
41 uid = getpwnam(uid).pw_uid |
|
42 os.setuid(uid) |
|
43 # See http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC16 |
|
44 if os.fork(): # launch child and... |
|
45 return -1 |
|
46 os.setsid() |
|
47 if os.fork(): # launch child and... |
|
48 os._exit(0) # kill off parent again. |
|
49 # move to the root to avoit mount pb |
|
50 os.chdir('/') |
|
51 # set paranoid umask |
|
52 os.umask(077) |
|
53 null = os.open('/dev/null', os.O_RDWR) |
|
54 for i in range(3): |
|
55 try: |
|
56 os.dup2(null, i) |
|
57 except OSError, e: |
|
58 if e.errno != errno.EBADF: |
|
59 raise |
|
60 os.close(null) |
|
61 return None |
33 |
62 |
34 def start_task(interval, func): |
63 def start_task(interval, func): |
35 lc = task.LoopingCall(func) |
64 lc = task.LoopingCall(func) |
36 lc.start(interval) |
65 lc.start(interval) |
37 |
66 |
366 reactor.listenTCP(port, channel.HTTPFactory(website)) |
395 reactor.listenTCP(port, channel.HTTPFactory(website)) |
367 baseurl = config['base-url'] or config.default_base_url() |
396 baseurl = config['base-url'] or config.default_base_url() |
368 logger = getLogger('cubicweb.twisted') |
397 logger = getLogger('cubicweb.twisted') |
369 logger.info('instance started on %s', baseurl) |
398 logger.info('instance started on %s', baseurl) |
370 if not debug: |
399 if not debug: |
371 daemonize() |
400 if daemonize(config['uid']): |
|
401 # child process |
|
402 return |
372 if config['pid-file']: |
403 if config['pid-file']: |
373 # ensure the directory where the pid-file should be set exists (for |
404 # ensure the directory where the pid-file should be set exists (for |
374 # instance /var/run/cubicweb may be deleted on computer restart) |
405 # instance /var/run/cubicweb may be deleted on computer restart) |
375 piddir = os.path.dirname(config['pid-file']) |
406 piddir = os.path.dirname(config['pid-file']) |
376 if not os.path.exists(piddir): |
407 if not os.path.exists(piddir): |