annotate roundup/scripts/roundup_server.py @ 5432:fec18298ae02

Python 3 preparation: HTTP headers handling in roundup_server.py. HTTP headers are handled differently in Python 3 (where they use email.message.Message) compared to Python 2 (where they use mimetools.Message). In some places the code needs to check which version of the interface is available. For the common case of getting a single header, ".get" is available in both versions, and is an alias of ".getheader" in Python 2. (Note that the Python 3 semantics of ".get" are slightly different from those in Python 2 if there is more than one of a given header - it returns an arbitrary one, when in Python 2 it's specified to return the last one. Hopefully the places using this interface rather than explicitly allowing for multiple headers with the same name are OK with that and it shouldn't actually occur with well-behaved clients.)
author Joseph Myers <jsm@polyomino.org.uk>
date Wed, 25 Jul 2018 10:41:32 +0000
parents 4c724ad7b849
children fb9abb842f36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
2 # This module is free software, and you may redistribute it and/or modify
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
3 # under the same terms as Python, so long as this copyright message and
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
4 # disclaimer are retained in their original form.
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
5 #
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
6 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
7 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
8 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
9 # POSSIBILITY OF SUCH DAMAGE.
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
10 #
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
11 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
12 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
13 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
14 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
15 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2308
e21c3a447a62 translate "cannot fork" error message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2287
diff changeset
16 #
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1953
diff changeset
17
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1953
diff changeset
18 """Command-line script that runs a server over roundup.cgi.client.
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
19 """
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
20 from __future__ import print_function
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1953
diff changeset
21 __docformat__ = 'restructuredtext'
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
22
4766
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
23
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
24 # --- patch sys.path to make sure 'import roundup' finds correct version
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
25 import sys
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
26 import os.path as osp
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
27
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
28 import logging
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
29
4766
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
30 thisdir = osp.dirname(osp.abspath(__file__))
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
31 rootdir = osp.dirname(osp.dirname(thisdir))
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
32 if (osp.exists(thisdir + '/__init__.py') and
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
33 osp.exists(rootdir + '/roundup/__init__.py')):
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
34 # the script is located inside roundup source code
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
35 sys.path.insert(0, rootdir)
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
36 # --/
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
37
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
38
5418
55f09ca366c4 Python 3 preparation: StringIO.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5410
diff changeset
39 import errno, cgi, getopt, io, os, socket, sys, traceback, time
5410
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
40
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
41 try:
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
42 # Python 3.
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
43 import socketserver
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
44 except ImportError:
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
45 # Python 2.
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
46 import SocketServer as socketserver
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
47
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
48 try:
5405
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
49 # Python 2.
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
50 reload
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
51 except NameError:
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
52 # Python 3.
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
53 from imp import reload
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
54
56cc58d20add Python 3 preparation: use imp.reload instead of reload as needed.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5403
diff changeset
55 try:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
56 from OpenSSL import SSL
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
57 except ImportError:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
58 SSL = None
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
59
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
60 # python version check
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
61 from roundup import configuration, version_check
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
62 from roundup import __version__ as roundup_version
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
63
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
64 # Roundup modules of use here
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
65 from roundup.anypy import http_, urllib_
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
66 from roundup.anypy.strings import s2b, StringIO
992
6003d6fa02a5 new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents: 661
diff changeset
67 from roundup.cgi import cgitb, client
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
68 from roundup.cgi.PageTemplates.PageTemplate import PageTemplate
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
69 import roundup.instance
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
70 from roundup.i18n import _
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
71
2181
740102dfad1d favicon generation stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2180
diff changeset
72 # "default" favicon.ico
740102dfad1d favicon generation stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2180
diff changeset
73 # generate by using "icotool" and tools/base64
1611
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
74 import zlib, base64
5426
5dc27422f3ec Python 3 preparation: use byte-string argument to base64.decodestring for favicon.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5418
diff changeset
75 favico = zlib.decompress(base64.decodestring(b'''
2180
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
76 eJztjr1PmlEUh59XgVoshdYPWorFIhaRFq0t9pNq37b60lYSTRzcTFw6GAfj5gDYaF0dTB0MxMSE
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
77 gQQd3FzKJiEC0UCIUUN1M41pV2JCXySg/0ITn5tfzvmdc+85FwT56HSc81UJjXJsk1UsNcsSqCk1
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
78 BS64lK+vr7OyssLJyQl2ux2j0cjU1BQajYZIJEIwGMRms+H3+zEYDExOTjI2Nsbm5iZWqxWv18vW
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
79 1hZDQ0Ok02kmJiY4Ojpienqa3d1dxsfHUSqVeDwe5ufnyeVyrK6u4nK5ODs7Y3FxEYfDwdzcHCaT
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
80 icPDQ5LJJIIgMDIyQj6fZ39/n+3tbdbW1pAkiYWFBWZmZtjb2yMejzM8PEwgEMDn85HNZonFYqjV
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
81 asLhMMvLy2QyGfR6PaOjowwODmKxWDg+PkalUhEKhSgUCiwtLWE2m9nZ2UGhULCxscHp6SmpVIpo
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
82 NMrs7CwHBwdotVoSiQRXXPG/IzY7RHtt922xjFRb01H1XhKfPBNbi/7my7rrLXJ88eppvxwEfV3f
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
83 NY3Y6exofVdsV3+2wnPFDdPjB83n7xuVpcFvygPbGwxF31LZIKrQDfR2Xvh7lmrX654L/7bvlnng
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
84 bn3Zuj8M9Hepux6VfZtW1yA6K7cfGqVu8TL325u+fHTb71QKbk+7TZQ+lTc6RcnpqW8qmVQBoj/g
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
85 23eo0sr/NIGvB37K+lOWXMvJ+uWFeKGU/03Cb7n3D4M3wxI=
1611
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
86 '''.strip()))
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
87
2637
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
88 DEFAULT_PORT = 8080
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
89
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
90 # See what types of multiprocess server are available
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
91 # Note: the order is important. Preferred multiprocess type
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
92 # is the last element of this list.
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
93 # "debug" means "none" + no tracker/template cache
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
94 MULTIPROCESS_TYPES = ["debug", "none"]
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
95 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
96 import thread
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
97 except ImportError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
98 pass
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
99 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
100 MULTIPROCESS_TYPES.append("thread")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
101 if hasattr(os, 'fork'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
102 MULTIPROCESS_TYPES.append("fork")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
103 DEFAULT_MULTIPROCESS = MULTIPROCESS_TYPES[-1]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
104
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
105 def auto_ssl():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
106 print(_('WARNING: generating temporary SSL certificate'))
5356
91954be46a66 A real fix for the problem where:
John Rouillard <rouilj@ieee.org>
parents: 5350
diff changeset
107 import OpenSSL, random
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
108 pkey = OpenSSL.crypto.PKey()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
109 pkey.generate_key(OpenSSL.crypto.TYPE_RSA, 768)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
110 cert = OpenSSL.crypto.X509()
5386
fc97f1f4a7e3 Python 3 preparation: use sys.maxsize instead of sys.maxint.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5381
diff changeset
111 cert.set_serial_number(random.randint(0, sys.maxsize))
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
112 cert.gmtime_adj_notBefore(0)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
113 cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) # one year
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
114 cert.get_subject().CN = '*'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
115 cert.get_subject().O = 'Roundup Dummy Certificate'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
116 cert.get_issuer().CN = 'Roundup Dummy Certificate Authority'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
117 cert.get_issuer().O = 'Self-Signed'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
118 cert.set_pubkey(pkey)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
119 cert.sign(pkey, 'md5')
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
120 ctx = SSL.Context(SSL.SSLv23_METHOD)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
121 ctx.use_privatekey(pkey)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
122 ctx.use_certificate(cert)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
123
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
124 return ctx
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
125
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
126 class SecureHTTPServer(http_.server.HTTPServer):
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
127 def __init__(self, server_address, HandlerClass, ssl_pem=None):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
128 assert SSL, "pyopenssl not installed"
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
129 http_.server.HTTPServer.__init__(self, server_address, HandlerClass)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
130 self.socket = socket.socket(self.address_family, self.socket_type)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
131 if ssl_pem:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
132 ctx = SSL.Context(SSL.SSLv23_METHOD)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
133 ctx.use_privatekey_file(ssl_pem)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
134 ctx.use_certificate_file(ssl_pem)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
135 else:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
136 ctx = auto_ssl()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
137 self.ssl_context = ctx
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
138 self.socket = SSL.Connection(ctx, self.socket)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
139 self.server_bind()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
140 self.server_activate()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
141
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
142 def get_request(self):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
143 (conn, info) = self.socket.accept()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
144 if self.ssl_context:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
145
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
146 class RetryingFile(object):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
147 """ SSL.Connection objects can return Want__Error
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
148 on recv/write, meaning "try again". We'll handle
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
149 the try looping here """
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
150 def __init__(self, fileobj):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
151 self.__fileobj = fileobj
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
152
3891
410cae6ab7dd need to pass arguments to wrapper readline for SSL servers
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3890
diff changeset
153 def readline(self, *args):
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
154 """ SSL.Connection can return WantRead """
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
155 while True:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
156 try:
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
157 return self.__fileobj.readline(*args)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
158 except SSL.WantReadError:
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
159 time.sleep(.1)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
160
4258
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
161 def read(self, *args):
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
162 """ SSL.Connection can return WantRead """
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
163 while True:
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
164 try:
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
165 return self.__fileobj.read(*args)
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
166 except SSL.WantReadError:
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
167 time.sleep(.1)
4258
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
168
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
169 def __getattr__(self, attrib):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
170 return getattr(self.__fileobj, attrib)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
171
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
172 class ConnFixer(object):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
173 """ wraps an SSL socket so that it implements makefile
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
174 which the HTTP handlers require """
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
175 def __init__(self, conn):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
176 self.__conn = conn
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
177 def makefile(self, mode, bufsize):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
178 fo = socket._fileobject(self.__conn, mode, bufsize)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
179 return RetryingFile(fo)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
180
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
181 def __getattr__(self, attrib):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
182 return getattr(self.__conn, attrib)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
183
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
184 conn = ConnFixer(conn)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
185 return (conn, info)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
186
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
187 class RoundupRequestHandler(http_.server.BaseHTTPRequestHandler):
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
188 TRACKER_HOMES = {}
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
189 TRACKERS = None
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
190 LOG_IPADDRESS = 1
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
191 DEBUG_MODE = False
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
192 CONFIG = None
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
193
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
194 def get_tracker(self, name):
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
195 """Return a tracker instance for given tracker name"""
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
196 # Note: try/except KeyError works faster that has_key() check
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
197 # if the key is usually found in the dictionary
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
198 #
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
199 # Return cached tracker instance if we have a tracker cache
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
200 if self.TRACKERS:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
201 try:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
202 return self.TRACKERS[name]
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
203 except KeyError:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
204 pass
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
205 # No cached tracker. Look for home path.
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
206 try:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
207 tracker_home = self.TRACKER_HOMES[name]
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
208 except KeyError:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
209 raise client.NotFound
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
210 # open the instance
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
211 tracker = roundup.instance.open(tracker_home)
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
212 # and cache it if we have a tracker cache
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
213 if self.TRACKERS:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
214 self.TRACKERS[name] = tracker
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
215 return tracker
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
216
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
217 def run_cgi(self):
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
218 """ Execute the CGI command. Wrap an innner call in an error
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
219 handler so all errors can be caught.
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
220 """
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
221 try:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
222 self.inner_run_cgi()
992
6003d6fa02a5 new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents: 661
diff changeset
223 except client.NotFound:
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
224 self.send_error(404, self.path)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5201
diff changeset
225 except client.Unauthorised as message:
2273
c77483d2cda4 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2230
diff changeset
226 self.send_error(403, '%s (%s)'%(self.path, message))
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
227 except:
1939
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
228 exc, val, tb = sys.exc_info()
2191
f7f6b6981a13 sqlite backend uses the global lock again
Richard Jones <richard@users.sourceforge.net>
parents: 2186
diff changeset
229 if hasattr(socket, 'timeout') and isinstance(val, socket.timeout):
2200
25b95aa44d60 socket timeout error logging can fail
Richard Jones <richard@users.sourceforge.net>
parents: 2191
diff changeset
230 self.log_error('timeout')
1939
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
231 else:
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
232 # it'd be nice to be able to detect if these are going to have
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
233 # any effect...
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
234 self.send_response(400)
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
235 self.send_header('Content-Type', 'text/html')
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
236 self.end_headers()
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
237 if self.DEBUG_MODE:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
238 try:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
239 reload(cgitb)
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
240 self.wfile.write(s2b(cgitb.breaker()))
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
241 self.wfile.write(s2b(cgitb.html()))
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
242 except:
5418
55f09ca366c4 Python 3 preparation: StringIO.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5410
diff changeset
243 s = StringIO()
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
244 traceback.print_exc(None, s)
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
245 self.wfile.write(b"<pre>")
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
246 self.wfile.write(s2b(cgi.escape(s.getvalue())))
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
247 self.wfile.write(b"</pre>\n")
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
248 else:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
249 # user feedback
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
250 self.wfile.write(s2b(cgitb.breaker()))
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
251 ts = time.ctime()
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
252 self.wfile.write(s2b('''<p>%s: An error occurred. Please check
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
253 the server log for more information.</p>'''%ts))
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
254 # out to the logfile
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
255 print('EXCEPTION AT', ts)
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
256 traceback.print_exc()
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
257
2592
5a8d9465827e implement the HTTP HEAD command [SF#992544]
Richard Jones <richard@users.sourceforge.net>
parents: 2566
diff changeset
258 do_GET = do_POST = do_HEAD = run_cgi
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
259
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
260 def index(self):
1251
347657425a10 Nicer display of tracker list in roundup-server [SF#619769]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
261 ''' Print up an index of the available trackers
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
262 '''
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5386
diff changeset
263 keys = list(self.TRACKER_HOMES.keys())
3205
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
264 if len(keys) == 1:
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
265 self.send_response(302)
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5398
diff changeset
266 self.send_header('Location', urllib_.quote(keys[0]) + '/index')
3849
9d37a6779530 End headers when redirecting to tracker. Closes [SF#1706114].
Erik Forsberg <forsberg@users.sourceforge.net>
parents: 3787
diff changeset
267 self.end_headers()
3205
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
268 else:
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
269 self.send_response(200)
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
270
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
271 self.send_header('Content-Type', 'text/html')
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
272 self.end_headers()
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
273 w = self.wfile.write
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
274
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
275 if self.CONFIG and self.CONFIG['TEMPLATE']:
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
276 template = open(self.CONFIG['TEMPLATE']).read()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
277 pt = PageTemplate()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
278 pt.write(template)
3890
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
279 extra = { 'trackers': self.TRACKERS,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
280 'nothing' : None,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
281 'true' : 1,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
282 'false' : 0,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
283 }
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
284 w(s2b(pt.pt_render(extra_context=extra)))
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
285 else:
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
286 w(s2b(_('<html><head><title>Roundup trackers index</title></head>\n'
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
287 '<body><h1>Roundup trackers index</h1><ol>\n')))
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
288 keys.sort()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
289 for tracker in keys:
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
290 w(s2b('<li><a href="%(tracker_url)s/index">%(tracker_name)s</a>\n'%{
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5398
diff changeset
291 'tracker_url': urllib_.quote(tracker),
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
292 'tracker_name': cgi.escape(tracker)}))
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
293 w(b'</ol></body></html>')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
294
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
295 def inner_run_cgi(self):
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
296 ''' This is the inner part of the CGI handling
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
297 '''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
298
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
299 # self.path is /some/path?with&all=stuff
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
300 if self.path == '/favicon.ico':
4911
0997d4d8e76c roundup_server: Code cleanup - move favicon object into its section
anatoly techtonik <techtonik@gmail.com>
parents: 4769
diff changeset
301 # file-like object for the favicon.ico file information
0997d4d8e76c roundup_server: Code cleanup - move favicon object into its section
anatoly techtonik <techtonik@gmail.com>
parents: 4769
diff changeset
302 favicon_fileobj = None
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
303
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
304 # check to see if a custom favicon was specified, and set
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
305 # favicon_fileobj to the input file
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
306 if self.CONFIG is not None:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
307 favicon_filepath = os.path.abspath(self.CONFIG['FAVICON'])
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
308
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
309 if os.access(favicon_filepath, os.R_OK):
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
310 favicon_fileobj = open(favicon_filepath, 'rb')
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
311
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
312
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
313 if favicon_fileobj is None:
5418
55f09ca366c4 Python 3 preparation: StringIO.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5410
diff changeset
314 favicon_fileobj = io.BytesIO(favico)
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
315
2176
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
316 self.send_response(200)
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
317 self.send_header('Content-Type', 'image/x-icon')
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
318 self.end_headers()
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
319
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
320 # this bufsize is completely arbitrary, I picked 4K because it sounded good.
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
321 # if someone knows of a better buffer size, feel free to plug it in.
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
322 bufsize = 4 * 1024
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
323 Processing = True
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
324 while Processing:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
325 data = favicon_fileobj.read(bufsize)
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
326 if len(data) > 0:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
327 self.wfile.write(data)
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
328 else:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
329 Processing = False
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
330
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
331 favicon_fileobj.close()
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
332
2176
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
333 return
1611
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
334
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
335 i = self.path.rfind('?')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
336 if i >= 0:
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
337 # rest starts with /, query is without ?
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
338 rest, query = self.path[:i], self.path[i+1:]
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
339 else:
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
340 rest = self.path
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
341 query = ''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
342
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
343 # no tracker - spit out the index
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
344 if rest == '/':
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
345 self.index()
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
346 return
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
347
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
348 # figure the tracker
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
349 l_path = rest.split('/')
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5398
diff changeset
350 tracker_name = urllib_.unquote(l_path[1]).lower()
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
351
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
352 # handle missing trailing '/'
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
353 if len(l_path) == 2:
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
354 self.send_response(301)
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
355 # redirect - XXX https??
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
356 protocol = 'http'
4913
8f6cfe824c9f roundup_server: Fix endless redirect on http://localhost:8917/demo?anything
anatoly techtonik <techtonik@gmail.com>
parents: 4912
diff changeset
357 url = '%s://%s%s/'%(protocol, self.headers['host'], rest)
8f6cfe824c9f roundup_server: Fix endless redirect on http://localhost:8917/demo?anything
anatoly techtonik <techtonik@gmail.com>
parents: 4912
diff changeset
358 if query:
8f6cfe824c9f roundup_server: Fix endless redirect on http://localhost:8917/demo?anything
anatoly techtonik <techtonik@gmail.com>
parents: 4912
diff changeset
359 url += '?' + query
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
360 self.send_header('Location', url)
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
361 self.end_headers()
5431
4c724ad7b849 Python 3 preparation: write bytes to socket in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5426
diff changeset
362 self.wfile.write(b'Moved Permanently')
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
363 return
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
364
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
365 # figure out what the rest of the path is
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
366 if len(l_path) > 2:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
367 rest = '/'.join(l_path[2:])
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
368 else:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
369 rest = '/'
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
370
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
371 # Set up the CGI environment
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
372 env = {}
1251
347657425a10 Nicer display of tracker list in roundup-server [SF#619769]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
373 env['TRACKER_NAME'] = tracker_name
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
374 env['REQUEST_METHOD'] = self.command
5402
88dbacd11cd1 Python 3 preparation: update urllib / urllib2 / urlparse imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5398
diff changeset
375 env['PATH_INFO'] = urllib_.unquote(rest)
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
376 if query:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
377 env['QUERY_STRING'] = query
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
378 if hasattr(self.headers, 'get_content_type'):
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
379 # Python 3. We need the raw header contents.
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
380 env['CONTENT_TYPE'] = self.headers.get('content-type')
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
381 elif self.headers.typeheader is None:
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
382 # Python 2.
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
383 env['CONTENT_TYPE'] = self.headers.type
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
384 else:
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
385 # Python 2.
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
386 env['CONTENT_TYPE'] = self.headers.typeheader
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
387 length = self.headers.get('content-length')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
388 if length:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
389 env['CONTENT_LENGTH'] = length
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
390 if hasattr(self.headers, 'get_all'):
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
391 # Python 3.
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
392 ch = self.headers.get_all('cookie', [])
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
393 else:
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
394 # Python 2.
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
395 ch = self.headers.getheaders('cookie')
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
396 co = list(filter(None, ch))
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
397 if co:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
398 env['HTTP_COOKIE'] = ', '.join(co)
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
399 env['HTTP_AUTHORIZATION'] = self.headers.get('authorization')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
400 env['SCRIPT_NAME'] = ''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
401 env['SERVER_NAME'] = self.server.server_name
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
402 env['SERVER_PORT'] = str(self.server.server_port)
4290
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
403 try:
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
404 env['HTTP_HOST'] = self.headers ['host']
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
405 except KeyError:
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
406 env['HTTP_HOST'] = ''
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
407 # https://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
408 # headers.
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
409 xfh = self.headers.get('X-Forwarded-Host', None)
5201
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
410 if xfh:
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
411 # If behind a proxy, this is the hostname supplied
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
412 # via the Host header to the proxy. Used by core code.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
413 # Controlled by the CSRF settings.
5201
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
414 env['HTTP_X-FORWARDED-HOST'] = xfh
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
415 xff = self.headers.get('X-Forwarded-For', None)
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
416 if xff:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
417 # xff is a list of ip addresses for original client/proxies:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
418 # X-Forwarded-For: clientIP, proxy1IP, proxy2IP
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
419 # May not be trustworthy. Do not use in core without
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
420 # config option to control its use.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
421 # Made available for extensions if the user trusts it.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
422 # E.g. you may wish to disable recaptcha validation extension
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
423 # if the ip of the client matches 172.16.0.0.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
424 env['HTTP_X-FORWARDED-FOR'] = xff
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
425 xfp = self.headers.get('X-Forwarded-Proto', None)
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
426 if xfp:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
427 # xfp is the protocol (http/https) seen by proxies in the
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
428 # path of the request. I am not sure if there is only
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
429 # one value or multiple, but I suspect multiple
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
430 # is possible so:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
431 # X-Forwarded-Proto: https, http
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
432 # is expected if the path is:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
433 # client -> proxy1 -> proxy2 -> back end server
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
434 # an proxy1 is an SSL terminator.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
435 # May not be trustworthy. Do not use in core without
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
436 # config option to control its use.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
437 # Made available for extensions if the user trusts it.
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
438 env['HTTP_X-FORWARDED-PROTO'] = xfp
5381
0942fe89e82e Python 3 preparation: change "x.has_key(y)" to "y in x".
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
439 if 'CGI_SHOW_TIMING' in os.environ:
2943
996e2bab8d8a propagate CGI_SHOW_TIMING from os.environ to request environment
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2852
diff changeset
440 env['CGI_SHOW_TIMING'] = os.environ['CGI_SHOW_TIMING']
3574
7bf2b4523b75 fix failure with browsers not sending "Accept-Language" header [SF#1435335]
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3438
diff changeset
441 env['HTTP_ACCEPT_LANGUAGE'] = self.headers.get('accept-language')
5201
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
442 referer = self.headers.get('Referer')
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
443 if referer:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
444 env['HTTP_REFERER'] = referer
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
445 origin = self.headers.get('Origin')
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
446 if origin:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
447 env['HTTP_ORIGIN'] = origin
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
448 xrw = self.headers.get('x-requested-with')
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
449 if xrw:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
450 env['HTTP_X-REQUESTED-WITH'] = xrw
5432
fec18298ae02 Python 3 preparation: HTTP headers handling in roundup_server.py.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5431
diff changeset
451 range = self.headers.get('range')
4475
207499c0a3ed Range support in roundup-server so large files can be served...
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 4344
diff changeset
452 if range:
207499c0a3ed Range support in roundup-server so large files can be served...
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 4344
diff changeset
453 env['HTTP_RANGE'] = range
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
454
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
455 # do the roundup thing
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
456 tracker = self.get_tracker(tracker_name)
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
457 tracker.Client(tracker, self, env).main()
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
458
1735
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
459 def address_string(self):
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
460 if self.LOG_IPADDRESS:
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
461 return self.client_address[0]
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
462 else:
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
463 host, port = self.client_address
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
464 return socket.getfqdn(host)
1632
eb4d04a9d647 added Windows Service mode for roundup-server...
Richard Jones <richard@users.sourceforge.net>
parents: 1611
diff changeset
465
2021
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
466 def log_message(self, format, *args):
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
467 ''' Try to *safely* log to stderr.
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
468 '''
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
469 if self.CONFIG['LOGHTTPVIALOGGER']:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
470 logger = logging.getLogger('roundup.http')
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
471
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
472 logger.info("%s - - [%s] %s" %
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
473 (self.client_address[0],
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
474 self.log_date_time_string(),
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
475 format%args))
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
476 else:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
477 try:
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
478 http_.server.BaseHTTPRequestHandler.log_message(self,
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
479 format, *args)
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
480 except IOError:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
481 # stderr is no longer viable
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
482 pass
2021
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
483
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
484 def start_response(self, headers, response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
485 self.send_response(response)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
486 for key, value in headers:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
487 self.send_header(key, value)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
488 self.end_headers()
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
489
1871
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
490 def error():
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
491 exc_type, exc_value = sys.exc_info()[:2]
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
492 return _('Error: %s: %s' % (exc_type, exc_value))
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
493
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
494 def setgid(group):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
495 if group is None:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
496 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
497 if not hasattr(os, 'setgid'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
498 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
499
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
500 # if root, setgid to the running user
3279
6e7462bbafde fix setgid typo [SF#1171346]
Richard Jones <richard@users.sourceforge.net>
parents: 3277
diff changeset
501 if os.getuid():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
502 print(_('WARNING: ignoring "-g" argument, not root'))
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
503 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
504
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
505 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
506 import grp
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
507 except ImportError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
508 raise ValueError(_("Can't change groups - no grp module"))
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
509 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
510 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
511 gid = int(group)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
512 except ValueError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
513 gid = grp.getgrnam(group)[2]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
514 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
515 grp.getgrgid(gid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
516 except KeyError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
517 raise ValueError(_("Group %(group)s doesn't exist")%locals())
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
518 os.setgid(gid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
519
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
520 def setuid(user):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
521 if not hasattr(os, 'getuid'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
522 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
523
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
524 # People can remove this check if they're really determined
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
525 if user is None:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
526 if os.getuid():
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
527 return
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
528 raise ValueError(_("Can't run as root!"))
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
529
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
530 if os.getuid():
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
531 print(_('WARNING: ignoring "-u" argument, not root'))
3733
2addec69757a fix: setuid called when run by non-root
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3609
diff changeset
532 return
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
533
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
534 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
535 import pwd
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
536 except ImportError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
537 raise ValueError(_("Can't change users - no pwd module"))
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
538 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
539 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
540 uid = int(user)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
541 except ValueError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
542 uid = pwd.getpwnam(user)[2]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
543 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
544 pwd.getpwuid(uid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
545 except KeyError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
546 raise ValueError(_("User %(user)s doesn't exist")%locals())
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
547 os.setuid(uid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
548
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
549 class TrackerHomeOption(configuration.FilePathOption):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
550
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
551 # Tracker homes do not need any description strings
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
552 def format(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
553 return "%(name)s = %(value)s\n" % {
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
554 "name": self.setting,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
555 "value": self.value2str(self._value),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
556 }
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
557
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
558 class ServerConfig(configuration.Config):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
559
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
560 SETTINGS = (
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
561 ("main", (
4489
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
562 (configuration.Option, "host", "localhost",
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
563 "Host name of the Roundup web server instance.\n"
4489
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
564 "If left unconfigured (no 'host' setting) the default\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
565 "will be used.\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
566 "If empty, listen on all network interfaces.\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
567 "If you want to explicitly listen on all\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
568 "network interfaces, the address 0.0.0.0 is a more\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
569 "explicit way to achieve this, the use of an empty\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
570 "string for this purpose is deprecated and will go away\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
571 "in a future release."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
572 (configuration.IntegerNumberOption, "port", DEFAULT_PORT,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
573 "Port to listen on."),
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
574 (configuration.NullableFilePathOption, "favicon", "favicon.ico",
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
575 "Path to favicon.ico image file."
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
576 " If unset, built-in favicon.ico is used."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
577 (configuration.NullableOption, "user", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
578 "User ID as which the server will answer requests.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
579 "In order to use this option, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
580 "the server must be run initially as root.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
581 "Availability: Unix."),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
582 (configuration.NullableOption, "group", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
583 "Group ID as which the server will answer requests.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
584 "In order to use this option, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
585 "the server must be run initially as root.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
586 "Availability: Unix."),
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
587 (configuration.BooleanOption, "nodaemon", "no",
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
588 "don't fork (this overrides the pidfile mechanism)'"),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
589 (configuration.BooleanOption, "log_hostnames", "no",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
590 "Log client machine names instead of IP addresses "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
591 "(much slower)"),
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
592 (configuration.BooleanOption, "loghttpvialogger", "no",
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
593 "Have http(s) request logging done via python logger module.\n"
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
594 "If set to yes the python logging module is used with "
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
595 "qualname\n'roundup.http'. Otherwise logging is done to "
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
596 "stderr or the file\nspecified using the -l/logfile option."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
597 (configuration.NullableFilePathOption, "pidfile", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
598 "File to which the server records "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
599 "the process id of the daemon.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
600 "If this option is not set, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
601 "the server will run in foreground\n"),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
602 (configuration.NullableFilePathOption, "logfile", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
603 "Log file path. If unset, log to stderr."),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
604 (configuration.Option, "multiprocess", DEFAULT_MULTIPROCESS,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
605 "Set processing of each request in separate subprocess.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
606 "Allowed values: %s." % ", ".join(MULTIPROCESS_TYPES)),
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
607 (configuration.NullableFilePathOption, "template", "",
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
608 "Tracker index template. If unset, built-in will be used."),
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
609 (configuration.BooleanOption, "ssl", "no",
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
610 "Enable SSL support (requires pyopenssl)"),
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
611 (configuration.NullableFilePathOption, "pem", "",
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
612 "PEM file used for SSL. A temporary self-signed certificate\n"
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
613 "will be used if left blank."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
614 )),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
615 ("trackers", (), "Roundup trackers to serve.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
616 "Each option in this section defines single Roundup tracker.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
617 "Option name identifies the tracker and will appear in the URL.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
618 "Option value is tracker home directory path.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
619 "The path may be either absolute or relative\n"
5102
96dc9f07340a issue2161722: oudated docs
John Rouillard <rouilj@ieee.org>
parents: 4913
diff changeset
620 "to the directory containing this config file."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
621 )
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
622
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
623 # options recognized by config
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
624 OPTIONS = {
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
625 "host": "n:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
626 "port": "p:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
627 "group": "g:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
628 "user": "u:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
629 "logfile": "l:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
630 "pidfile": "d:",
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
631 "nodaemon": "D",
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
632 "log_hostnames": "N",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
633 "multiprocess": "t:",
3884
1165f2204542 Ooops...not sure where those tabs came from. Making them spaces.
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3883
diff changeset
634 "template": "i:",
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
635 "loghttpvialogger": 'L',
3884
1165f2204542 Ooops...not sure where those tabs came from. Making them spaces.
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3883
diff changeset
636 "ssl": "s",
1165f2204542 Ooops...not sure where those tabs came from. Making them spaces.
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3883
diff changeset
637 "pem": "e:",
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
638 }
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
639
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
640 def __init__(self, config_file=None):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
641 configuration.Config.__init__(self, config_file, self.SETTINGS)
3022
9523de67ecad merge from maint-0-8
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2943
diff changeset
642 self.sections.append("trackers")
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
643
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
644 def _adjust_options(self, config):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
645 """Add options for tracker homes"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
646 # return early if there are no tracker definitions.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
647 # trackers must be specified on the command line.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
648 if not config.has_section("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
649 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
650 # config defaults appear in all sections.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
651 # filter them out.
5395
23b8e6067f7c Python 3 preparation: update calls to dict methods.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5386
diff changeset
652 defaults = list(config.defaults().keys())
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
653 for name in config.options("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
654 if name not in defaults:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
655 self.add_option(TrackerHomeOption(self, "trackers", name))
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
656
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
657 def getopt(self, args, short_options="", long_options=(),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
658 config_load_options=("C", "config"), **options
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
659 ):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
660 options.update(self.OPTIONS)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
661 return configuration.Config.getopt(self, args,
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
662 short_options, long_options, config_load_options, **options)
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
663
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
664 def _get_name(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
665 return "Roundup server"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
666
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
667 def trackers(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
668 """Return tracker definitions as a list of (name, home) pairs"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
669 trackers = []
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
670 for option in self._get_section_options("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
671 trackers.append((option, os.path.abspath(
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
672 self["TRACKERS_" + option.upper()])))
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
673 return trackers
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
674
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
675 def set_logging(self):
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
676 """Initialise logging to the configured file, if any."""
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
677 # appending, unbuffered
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
678 sys.stdout = sys.stderr = open(self["LOGFILE"], 'a', 0)
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
679
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
680 def get_server(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
681 """Return HTTP server object to run"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
682 # we don't want the cgi module interpreting the command-line args ;)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
683 sys.argv = sys.argv[:1]
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
684
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
685 # preload all trackers unless we are in "debug" mode
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
686 tracker_homes = self.trackers()
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
687 if self["MULTIPROCESS"] == "debug":
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
688 trackers = None
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
689 else:
2852
37e6ebd5ba29 when preloading trackers (not running in 'debug' mode)...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2848
diff changeset
690 trackers = dict([(name, roundup.instance.open(home, optimize=1))
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
691 for (name, home) in tracker_homes])
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
692
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
693 # build customized request handler class
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
694 class RequestHandler(RoundupRequestHandler):
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
695 LOG_IPADDRESS = not self["LOG_HOSTNAMES"]
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
696 TRACKER_HOMES = dict(tracker_homes)
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
697 TRACKERS = trackers
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
698 DEBUG_MODE = self["MULTIPROCESS"] == "debug"
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
699 CONFIG = self
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
700
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
701 def setup(self):
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
702 if self.CONFIG["SSL"]:
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
703 # perform initial ssl handshake. This will set
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
704 # internal state correctly so that later closing SSL
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
705 # socket works (with SSL end-handshake started)
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
706 self.request.do_handshake()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
707 RoundupRequestHandler.setup(self)
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
708
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
709 def finish(self):
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
710 RoundupRequestHandler.finish(self)
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
711 if self.CONFIG["SSL"]:
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
712 self.request.shutdown()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
713 self.request.close()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
714
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
715 if self["SSL"]:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
716 base_server = SecureHTTPServer
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
717 else:
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
718 # time out after a minute if we can
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
719 # This sets the socket to non-blocking. SSL needs a blocking
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
720 # socket, so we do this only for non-SSL connections.
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
721 if hasattr(socket, 'setdefaulttimeout'):
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
722 socket.setdefaulttimeout(60)
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5405
diff changeset
723 base_server = http_.server.HTTPServer
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
724
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
725 # obtain request server class
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
726 if self["MULTIPROCESS"] not in MULTIPROCESS_TYPES:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
727 print(_("Multiprocess mode \"%s\" is not available, "
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
728 "switching to single-process") % self["MULTIPROCESS"])
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
729 self["MULTIPROCESS"] = "none"
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
730 server_class = base_server
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
731 elif self["MULTIPROCESS"] == "fork":
5410
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
732 class ForkingServer(socketserver.ForkingMixIn,
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
733 base_server):
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
734 pass
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
735 server_class = ForkingServer
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
736 elif self["MULTIPROCESS"] == "thread":
5410
d0816d50ee8f Python 3 preparation: update SocketServer import.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5409
diff changeset
737 class ThreadingServer(socketserver.ThreadingMixIn,
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
738 base_server):
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
739 pass
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
740 server_class = ThreadingServer
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
741 else:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
742 server_class = base_server
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
743
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
744 # obtain server before changing user id - allows to
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
745 # use port < 1024 if started as root
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
746 try:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
747 args = ((self["HOST"], self["PORT"]), RequestHandler)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
748 kwargs = {}
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
749 if self["SSL"]:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
750 kwargs['ssl_pem'] = self["PEM"]
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
751 httpd = server_class(*args, **kwargs)
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5201
diff changeset
752 except socket.error as e:
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
753 if e[0] == errno.EADDRINUSE:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
754 raise socket.error(_("Unable to bind to port %s, port already in use.") \
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
755 % self["PORT"])
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
756 raise
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
757 # change user and/or group
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
758 setgid(self["GROUP"])
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
759 setuid(self["USER"])
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
760 # return the server
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
761 return httpd
2230
ca2664e095be disable forking server when os.fork() not available [SF#938586]
Richard Jones <richard@users.sourceforge.net>
parents: 2200
diff changeset
762
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
763 try:
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
764 import win32serviceutil
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
765 except:
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
766 RoundupService = None
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
767 else:
2230
ca2664e095be disable forking server when os.fork() not available [SF#938586]
Richard Jones <richard@users.sourceforge.net>
parents: 2200
diff changeset
768
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
769 # allow the win32
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
770 import win32service
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
771
5266
e9158c0a6eba Python 2 and 3 support. Convert Exception to BaseException scripts.
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
772 class SvcShutdown(BaseException):
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
773 pass
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
774
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
775 class RoundupService(win32serviceutil.ServiceFramework):
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
776
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
777 _svc_name_ = "roundup"
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
778 _svc_display_name_ = "Roundup Bug Tracker"
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
779
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
780 running = 0
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
781 server = None
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
782
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
783 def SvcDoRun(self):
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
784 import servicemanager
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
785 self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
786 config = ServerConfig()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
787 (optlist, args) = config.getopt(sys.argv[1:])
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
788 if not config["LOGFILE"]:
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
789 servicemanager.LogMsg(servicemanager.EVENTLOG_ERROR_TYPE,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
790 servicemanager.PYS_SERVICE_STOPPED,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
791 (self._svc_display_name_, "\r\nMissing logfile option"))
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
792 self.ReportServiceStatus(win32service.SERVICE_STOPPED)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
793 return
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
794 config.set_logging()
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
795 self.server = config.get_server()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
796 self.running = 1
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
797 self.ReportServiceStatus(win32service.SERVICE_RUNNING)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
798 servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
799 servicemanager.PYS_SERVICE_STARTED, (self._svc_display_name_,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
800 " at %s:%s" % (config["HOST"], config["PORT"])))
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
801 while self.running:
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
802 self.server.handle_request()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
803 servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
804 servicemanager.PYS_SERVICE_STOPPED,
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
805 (self._svc_display_name_, ""))
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
806 self.ReportServiceStatus(win32service.SERVICE_STOPPED)
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
807
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
808 def SvcStop(self):
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
809 self.running = 0
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
810 # make dummy connection to self to terminate blocking accept()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
811 addr = self.server.socket.getsockname()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
812 if addr[0] == "0.0.0.0":
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
813 addr = ("127.0.0.1", addr[1])
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
814 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
815 sock.connect(addr)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
816 sock.close()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
817 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
818
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
819 def usage(message=''):
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
820 if RoundupService:
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
821 os_part = \
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
822 ""''' -c <Command> Windows Service options.
2521
8822780fa519 mark non-windows usage part for translation;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2483
diff changeset
823 If you want to run the server as a Windows Service, you
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
824 must use configuration file to specify tracker homes.
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
825 Logfile option is required to run Roundup Tracker service.
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
826 Typing "roundup-server -c help" shows Windows Services
2521
8822780fa519 mark non-windows usage part for translation;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2483
diff changeset
827 specifics.'''
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
828 else:
2521
8822780fa519 mark non-windows usage part for translation;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2483
diff changeset
829 os_part = ""''' -u <UID> runs the Roundup web server as this UID
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
830 -g <GID> runs the Roundup web server as this GID
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
831 -d <PIDfile> run the server in the background and write the server's PID
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
832 to the file indicated by PIDfile. The -l option *must* be
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
833 specified if -d is used.'''
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
834 if message:
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
835 message += '\n'
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
836 print(_('''%(message)sUsage: roundup-server [options] [name=tracker home]*
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
837
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
838 Options:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
839 -v print the Roundup version number and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
840 -h print this text and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
841 -S create or update configuration file and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
842 -C <fname> use configuration file <fname>
4489
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
843 -n <name> set the host name of the Roundup web server instance,
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
844 specifies on which network interfaces to listen for
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
845 connections, defaults to localhost, use 0.0.0.0 to bind
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
846 to all network interfaces
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
847 -p <port> set the port to listen on (default: %(port)s)
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
848 -l <fname> log to the file indicated by fname instead of stderr/stdout
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
849 -N log client machine names instead of IP addresses (much slower)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
850 -i <fname> set tracker index template
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
851 -s enable SSL
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
852 -L http request logging uses python logging (roundup.http)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
853 -e <fname> PEM file containing SSL key and certificate
2843
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
854 -t <mode> multiprocess mode (default: %(mp_def)s).
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
855 Allowed values: %(mp_types)s.
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
856 %(os_part)s
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
857
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
858 Long options:
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
859 --version print the Roundup version number and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
860 --help print this text and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
861 --save-config create or update configuration file and exit
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
862 --config <fname> use configuration file <fname>
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
863 All settings of the [main] section of the configuration file
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
864 also may be specified in form --<name>=<value>
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
865
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
866 Examples:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
867
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
868 roundup-server -S -C /opt/roundup/etc/roundup-server.ini \\
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
869 -n localhost -p 8917 -l /var/log/roundup.log \\
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
870 support=/var/spool/roundup-trackers/support
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
871
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
872 roundup-server -C /opt/roundup/etc/roundup-server.ini
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
873
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
874 roundup-server support=/var/spool/roundup-trackers/support
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
875
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
876 roundup-server -d /var/run/roundup.pid -l /var/log/roundup.log \\
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
877 support=/var/spool/roundup-trackers/support
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
878
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
879 Configuration file format:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
880 Roundup Server configuration file has common .ini file format.
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
881 Configuration file created with 'roundup-server -S' contains
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
882 detailed explanations for each option. Please see that file
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
883 for option descriptions.
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
884
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
885 How to use "name=tracker home":
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
886 These arguments set the tracker home(s) to use. The name is how the
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
887 tracker is identified in the URL (it's the first part of the URL path).
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
888 The tracker home is the directory that was identified when you did
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
889 "roundup-admin init". You may specify any number of these name=home
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
890 pairs on the command-line. Make sure the name part doesn't include
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
891 any url-unsafe characters like spaces, as these confuse IE.
2843
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
892 ''') % {
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
893 "message": message,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
894 "os_part": os_part,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
895 "port": DEFAULT_PORT,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
896 "mp_def": DEFAULT_MULTIPROCESS,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
897 "mp_types": ", ".join(MULTIPROCESS_TYPES),
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
898 })
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
899
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
900
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
901 def writepidfile(pidfile):
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
902 ''' Write a pidfile (only). Do not daemonize. '''
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
903 pid = os.getpid()
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
904 if pid:
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
905 pidfile = open(pidfile, 'w')
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
906 pidfile.write(str(pid))
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
907 pidfile.close()
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
908
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
909 def daemonize(pidfile):
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
910 ''' Turn this process into a daemon.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
911 - make sure the sys.std(in|out|err) are completely cut off
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
912 - make our parent PID 1
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
913
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
914 Write our new PID to the pidfile.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
915
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
916 From A.M. Kuuchling (possibly originally Greg Ward) with
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
917 modification from Oren Tirosh, and finally a small mod from me.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
918 '''
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
919 # Fork once
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
920 if os.fork() != 0:
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
921 os._exit(0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
922
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
923 # Create new session
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
924 os.setsid()
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
925
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
926 # Second fork to force PPID=1
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
927 pid = os.fork()
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
928 if pid:
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
929 pidfile = open(pidfile, 'w')
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
930 pidfile.write(str(pid))
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
931 pidfile.close()
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
932 os._exit(0)
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
933
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
934 os.chdir("/")
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
935
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
936 # close off std(in|out|err), redirect to devnull so the file
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
937 # descriptors can't be used again
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
938 devnull = os.open('/dev/null', 0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
939 os.dup2(devnull, 0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
940 os.dup2(devnull, 1)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
941 os.dup2(devnull, 2)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
942
2637
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
943 undefined = []
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
944 def run(port=undefined, success_message=None):
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1183
diff changeset
945 ''' Script entry point - handle args and figure out what to to.
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1183
diff changeset
946 '''
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
947 config = ServerConfig()
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
948 # additional options
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
949 short_options = "hvS"
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
950 if RoundupService:
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
951 short_options += 'c'
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
952 try:
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
953 (optlist, args) = config.getopt(sys.argv[1:],
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
954 short_options, ("help", "version", "save-config",))
5248
198b6e810c67 Use Python-3-compatible 'as' syntax for except statements
Eric S. Raymond <esr@thyrsus.com>
parents: 5201
diff changeset
955 except (getopt.GetoptError, configuration.ConfigurationError) as e:
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
956 usage(str(e))
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
957 return
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
958
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
959 # if running in windows service mode, don't do any other stuff
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
960 if ("-c", "") in optlist:
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
961 # acquire command line options recognized by service
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
962 short_options = "cC:"
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
963 long_options = ["config"]
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
964 for (long_name, short_name) in config.OPTIONS.items():
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
965 short_options += short_name
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
966 long_name = long_name.lower().replace("_", "-")
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
967 if short_name[-1] == ":":
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
968 long_name += "="
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
969 long_options.append(long_name)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
970 optlist = getopt.getopt(sys.argv[1:], short_options, long_options)[0]
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
971 svc_args = []
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
972 for (opt, arg) in optlist:
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
973 if opt in ("-C", "-l"):
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
974 # make sure file name is absolute
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
975 svc_args.extend((opt, os.path.abspath(arg)))
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
976 elif opt in ("--config", "--logfile"):
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
977 # ditto, for long options
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
978 svc_args.append("=".join(opt, os.path.abspath(arg)))
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
979 elif opt != "-c":
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
980 svc_args.extend(opt)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
981 RoundupService._exe_args_ = " ".join(svc_args)
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
982 # pass the control to serviceutil
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
983 win32serviceutil.HandleCommandLine(RoundupService,
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
984 argv=sys.argv[:1] + args)
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
985 return
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
986
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
987 # add tracker names from command line.
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
988 # this is done early to let '--save-config' handle the trackers.
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
989 if args:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
990 for arg in args:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
991 try:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
992 name, home = arg.split('=')
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
993 except ValueError:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5376
diff changeset
994 raise ValueError(_("Instances must be name=home"))
2772
52460ff89e10 fix: tracker definitions from the command line...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2771
diff changeset
995 config.add_option(TrackerHomeOption(config, "trackers", name))
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
996 config["TRACKERS_" + name.upper()] = home
2308
e21c3a447a62 translate "cannot fork" error message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2287
diff changeset
997
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
998 # handle remaining options
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
999 if optlist:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1000 for (opt, arg) in optlist:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1001 if opt in ("-h", "--help"):
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1002 usage()
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1003 elif opt in ("-v", "--version"):
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1004 print('%s (python %s)' % (roundup_version,
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1005 sys.version.split()[0]))
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1006 elif opt in ("-S", "--save-config"):
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1007 config.save()
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1008 print(_("Configuration saved to %s") % config.filepath)
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1009 # any of the above options prevent server from running
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1010 return
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1011
2774
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
1012 # port number in function arguments overrides config and command line
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
1013 if port is not undefined:
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
1014 config.PORT = port
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
1015
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1016 if config["LOGFILE"]:
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1017 config["LOGFILE"] = os.path.abspath(config["LOGFILE"])
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1018 # switch logging from stderr/stdout to logfile
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1019 config.set_logging()
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1020 if config["PIDFILE"]:
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1021 config["PIDFILE"] = os.path.abspath(config["PIDFILE"])
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1022
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
1023 # fork the server from our parent if a pidfile is specified
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
1024 if config["PIDFILE"]:
1843
d31a25046136 support setgid and running on port < 1024 (patch [SF#777528])
Richard Jones <richard@users.sourceforge.net>
parents: 1831
diff changeset
1025 if not hasattr(os, 'fork'):
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1026 print(_("Sorry, you can't run the server as a daemon"
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1027 " on this Operating System"))
1409
8dc60d87ab42 Fixed a backlog of bug reports, and worked on python 2.3 compatibility:
Richard Jones <richard@users.sourceforge.net>
parents: 1367
diff changeset
1028 sys.exit(0)
1632
eb4d04a9d647 added Windows Service mode for roundup-server...
Richard Jones <richard@users.sourceforge.net>
parents: 1611
diff changeset
1029 else:
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1030 if config['NODAEMON']:
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1031 writepidfile(config["PIDFILE"])
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1032 else:
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1033 daemonize(config["PIDFILE"])
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
1034
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
1035 # create the server
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
1036 httpd = config.get_server()
1047
1890c611de08 add daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 992
diff changeset
1037
1868
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1038 if success_message:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1039 print(success_message)
1868
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1040 else:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1041 print(_('Roundup server started on %(HOST)s:%(PORT)s')
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1042 % config)
1868
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1043
1311
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1044 try:
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1045 httpd.serve_forever()
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1046 except KeyboardInterrupt:
5376
64b05e24dbd8 Python 3 preparation: convert print to a function.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5356
diff changeset
1047 print('Keyboard Interrupt: exiting')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1048
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1049 if __name__ == '__main__':
593
2256f81293c1 Conversion to generated script stubs
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 592
diff changeset
1050 run()
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1051
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
1052 # vim: sts=4 sw=4 et si

Roundup Issue Tracker: http://roundup-tracker.org/