annotate roundup/scripts/roundup_server.py @ 5350:66a17c80e035

Force all uses of random to use SystemRandom and abort if pseudorandom random.Random would be used rather than Random.SystemRandom. random.Random is returning the same value time after time. Even when being seeded after instantiation, calls to the random.random() function return the same value like it's not advanceing the state of the generator. So "fix" is to force use of system random generator to generate: one time keys for password reset (action.py) random passwords when resetting passwords (password.py) serial number for auto ssl cert generation (roundup_server.py) Message-ID's in email: mailgw.py, client.py anti-csrf nonces (templating.py)
author John Rouillard <rouilj@ieee.org>
date Sat, 07 Jul 2018 22:02:41 -0400
parents 762222535a0b
children 91954be46a66
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 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1953
diff changeset
20 __docformat__ = 'restructuredtext'
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
21
4766
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
22
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
23 # --- 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
24 import sys
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
25 import os.path as osp
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
26
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
27 import logging
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
28
4766
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
29 thisdir = osp.dirname(osp.abspath(__file__))
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
30 rootdir = osp.dirname(osp.dirname(thisdir))
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
31 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
32 osp.exists(rootdir + '/roundup/__init__.py')):
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
33 # 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
34 sys.path.insert(0, rootdir)
86ef4ab17dc5 Run scripts (roundup_admin.py, ...) directly from checkout.
anatoly techtonik <techtonik@gmail.com>
parents: 4570
diff changeset
35 # --/
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
3277
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
38 import errno, cgi, getopt, os, socket, sys, traceback, urllib, time
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
39 import ConfigParser, BaseHTTPServer, SocketServer, StringIO
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
40
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
41 try:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
42 from OpenSSL import SSL
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
43 except ImportError:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
44 SSL = None
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
45
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
46 # python version check
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
47 from roundup import configuration, version_check
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
48 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
49
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
50 # Roundup modules of use here
992
6003d6fa02a5 new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents: 661
diff changeset
51 from roundup.cgi import cgitb, client
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
52 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
53 import roundup.instance
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
54 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
55
2181
740102dfad1d favicon generation stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2180
diff changeset
56 # "default" favicon.ico
740102dfad1d favicon generation stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2180
diff changeset
57 # 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
58 import zlib, base64
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
59 favico = zlib.decompress(base64.decodestring('''
2180
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
60 eJztjr1PmlEUh59XgVoshdYPWorFIhaRFq0t9pNq37b60lYSTRzcTFw6GAfj5gDYaF0dTB0MxMSE
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
61 gQQd3FzKJiEC0UCIUUN1M41pV2JCXySg/0ITn5tfzvmdc+85FwT56HSc81UJjXJsk1UsNcsSqCk1
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
62 BS64lK+vr7OyssLJyQl2ux2j0cjU1BQajYZIJEIwGMRms+H3+zEYDExOTjI2Nsbm5iZWqxWv18vW
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
63 1hZDQ0Ok02kmJiY4Ojpienqa3d1dxsfHUSqVeDwe5ufnyeVyrK6u4nK5ODs7Y3FxEYfDwdzcHCaT
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
64 icPDQ5LJJIIgMDIyQj6fZ39/n+3tbdbW1pAkiYWFBWZmZtjb2yMejzM8PEwgEMDn85HNZonFYqjV
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
65 asLhMMvLy2QyGfR6PaOjowwODmKxWDg+PkalUhEKhSgUCiwtLWE2m9nZ2UGhULCxscHp6SmpVIpo
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
66 NMrs7CwHBwdotVoSiQRXXPG/IzY7RHtt922xjFRb01H1XhKfPBNbi/7my7rrLXJ88eppvxwEfV3f
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
67 NY3Y6exofVdsV3+2wnPFDdPjB83n7xuVpcFvygPbGwxF31LZIKrQDfR2Xvh7lmrX654L/7bvlnng
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
68 bn3Zuj8M9Hepux6VfZtW1yA6K7cfGqVu8TL325u+fHTb71QKbk+7TZQ+lTc6RcnpqW8qmVQBoj/g
58b6d1747973 Web interface tweaks.
Richard Jones <richard@users.sourceforge.net>
parents: 2176
diff changeset
69 23eo0sr/NIGvB37K+lOWXMvJ+uWFeKGU/03Cb7n3D4M3wxI=
1611
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
70 '''.strip()))
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
71
2637
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
72 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
73
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
74 # 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
75 # 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
76 # 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
77 # "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
78 MULTIPROCESS_TYPES = ["debug", "none"]
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
79 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
80 import thread
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
81 except ImportError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
82 pass
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
83 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
84 MULTIPROCESS_TYPES.append("thread")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
85 if hasattr(os, 'fork'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
86 MULTIPROCESS_TYPES.append("fork")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
87 DEFAULT_MULTIPROCESS = MULTIPROCESS_TYPES[-1]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
88
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
89 def auto_ssl():
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
90 print _('WARNING: generating temporary SSL certificate')
5350
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
91 import OpenSSL
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
92
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
93 try:
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
94 # Use the cryptographic source of randomness if available
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
95 from random import SystemRandom
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
96 random=SystemRandom()
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
97 except ImportError:
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
98 raise
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
99 from random import Random
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
100 random=Random()
66a17c80e035 Force all uses of random to use SystemRandom and abort if
John Rouillard <rouilj@ieee.org>
parents: 5323
diff changeset
101
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
102 pkey = OpenSSL.crypto.PKey()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
103 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
104 cert = OpenSSL.crypto.X509()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
105 cert.set_serial_number(random.randint(0, sys.maxint))
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
106 cert.gmtime_adj_notBefore(0)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
107 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
108 cert.get_subject().CN = '*'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
109 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
110 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
111 cert.get_issuer().O = 'Self-Signed'
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
112 cert.set_pubkey(pkey)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
113 cert.sign(pkey, 'md5')
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
114 ctx = SSL.Context(SSL.SSLv23_METHOD)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
115 ctx.use_privatekey(pkey)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
116 ctx.use_certificate(cert)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
117
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
118 return ctx
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
119
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
120 class SecureHTTPServer(BaseHTTPServer.HTTPServer):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
121 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
122 assert SSL, "pyopenssl not installed"
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
123 BaseHTTPServer.HTTPServer.__init__(self, server_address, HandlerClass)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
124 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
125 if ssl_pem:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
126 ctx = SSL.Context(SSL.SSLv23_METHOD)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
127 ctx.use_privatekey_file(ssl_pem)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
128 ctx.use_certificate_file(ssl_pem)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
129 else:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
130 ctx = auto_ssl()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
131 self.ssl_context = ctx
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
132 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
133 self.server_bind()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
134 self.server_activate()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
135
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
136 def get_request(self):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
137 (conn, info) = self.socket.accept()
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
138 if self.ssl_context:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
139
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
140 class RetryingFile(object):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
141 """ 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
142 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
143 the try looping here """
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
144 def __init__(self, fileobj):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
145 self.__fileobj = fileobj
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
146
3891
410cae6ab7dd need to pass arguments to wrapper readline for SSL servers
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3890
diff changeset
147 def readline(self, *args):
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
148 """ SSL.Connection can return WantRead """
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
149 while True:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
150 try:
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
151 return self.__fileobj.readline(*args)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
152 except SSL.WantReadError:
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
153 time.sleep(.1)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
154
4258
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
155 def read(self, *args):
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
156 """ SSL.Connection can return WantRead """
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
157 while True:
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
158 try:
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
159 return self.__fileobj.read(*args)
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
160 except SSL.WantReadError:
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
161 time.sleep(.1)
4258
6432c9bfd385 Fix bug with SSL-connection and XMLRPC...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 3919
diff changeset
162
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
163 def __getattr__(self, attrib):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
164 return getattr(self.__fileobj, attrib)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
165
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
166 class ConnFixer(object):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
167 """ 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
168 which the HTTP handlers require """
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
169 def __init__(self, conn):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
170 self.__conn = conn
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
171 def makefile(self, mode, bufsize):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
172 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
173 return RetryingFile(fo)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
174
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
175 def __getattr__(self, attrib):
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
176 return getattr(self.__conn, attrib)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
177
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
178 conn = ConnFixer(conn)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
179 return (conn, info)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
180
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
181 class RoundupRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
182 TRACKER_HOMES = {}
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
183 TRACKERS = None
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
184 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
185 DEBUG_MODE = False
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
186 CONFIG = None
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
187
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
188 def get_tracker(self, name):
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
189 """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
190 # 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
191 # 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
192 #
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
193 # 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
194 if self.TRACKERS:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
195 try:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
196 return self.TRACKERS[name]
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
197 except KeyError:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
198 pass
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
199 # 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
200 try:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
201 tracker_home = self.TRACKER_HOMES[name]
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
202 except KeyError:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
203 raise client.NotFound
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
204 # open the instance
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
205 tracker = roundup.instance.open(tracker_home)
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
206 # 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
207 if self.TRACKERS:
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
208 self.TRACKERS[name] = tracker
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
209 return tracker
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
210
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
211 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
212 """ 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
213 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
214 """
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
215 try:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
216 self.inner_run_cgi()
992
6003d6fa02a5 new CGI frontend support
Richard Jones <richard@users.sourceforge.net>
parents: 661
diff changeset
217 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
218 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
219 except client.Unauthorised as message:
2273
c77483d2cda4 merge from maint-0-7
Richard Jones <richard@users.sourceforge.net>
parents: 2230
diff changeset
220 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
221 except:
1939
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
222 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
223 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
224 self.log_error('timeout')
1939
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
225 else:
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
226 # 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
227 # any effect...
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
228 self.send_response(400)
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
229 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
230 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
231 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
232 try:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
233 reload(cgitb)
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
234 self.wfile.write(cgitb.breaker())
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
235 self.wfile.write(cgitb.html())
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
236 except:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
237 s = StringIO.StringIO()
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
238 traceback.print_exc(None, s)
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
239 self.wfile.write("<pre>")
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
240 self.wfile.write(cgi.escape(s.getvalue()))
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
241 self.wfile.write("</pre>\n")
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
242 else:
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
243 # user feedback
1939
1303c208419d some updates that were sitting on disk
Richard Jones <richard@users.sourceforge.net>
parents: 1914
diff changeset
244 self.wfile.write(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
245 ts = time.ctime()
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
246 self.wfile.write('''<p>%s: An error occurred. Please check
4769
52b0e416f0bc Fix typo
Ralf Schlatterbeck <rsc@runtux.com>
parents: 4766
diff changeset
247 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
248 # out to the logfile
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
249 print 'EXCEPTION AT', ts
3084b07ec266 send errors in the web interface to a logfile by default.
Richard Jones <richard@users.sourceforge.net>
parents: 3205
diff changeset
250 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
251
2592
5a8d9465827e implement the HTTP HEAD command [SF#992544]
Richard Jones <richard@users.sourceforge.net>
parents: 2566
diff changeset
252 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
253
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
254 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
255 ''' 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
256 '''
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
257 keys = self.TRACKER_HOMES.keys()
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
258 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
259 self.send_response(302)
dbd6ba721943 if there is only one tracker, redirect from trackers list to the tracker
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3112
diff changeset
260 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
261 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
262 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
263 self.send_response(200)
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
264
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
265 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
266 self.end_headers()
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
267 w = self.wfile.write
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
268
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
269 if self.CONFIG and self.CONFIG['TEMPLATE']:
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
270 template = open(self.CONFIG['TEMPLATE']).read()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
271 pt = PageTemplate()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
272 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
273 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
274 'nothing' : None,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
275 'true' : 1,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
276 'false' : 0,
41948328f987 a couple more variables for tracker index templates per alex
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3884
diff changeset
277 }
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
278 w(pt.pt_render(extra_context=extra))
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
279 else:
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
280 w(_('<html><head><title>Roundup trackers index</title></head>\n'
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
281 '<body><h1>Roundup trackers index</h1><ol>\n'))
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
282 keys.sort()
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
283 for tracker in keys:
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
284 w('<li><a href="%(tracker_url)s/index">%(tracker_name)s</a>\n'%{
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
285 'tracker_url': urllib.quote(tracker),
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
286 'tracker_name': cgi.escape(tracker)})
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
287 w('</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
288
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
289 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
290 ''' 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
291 '''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
292
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
293 # 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
294 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
295 # 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
296 favicon_fileobj = None
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
297
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
298 # 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
299 # favicon_fileobj to the input file
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
300 if self.CONFIG is not None:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
301 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
302
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
303 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
304 favicon_fileobj = open(favicon_filepath, 'rb')
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
305
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
306
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
307 if favicon_fileobj is None:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
308 favicon_fileobj = StringIO.StringIO(favico)
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
309
2176
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
310 self.send_response(200)
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
311 self.send_header('Content-Type', 'image/x-icon')
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
312 self.end_headers()
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
313
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
314 # 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
315 # 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
316 bufsize = 4 * 1024
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
317 Processing = True
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
318 while Processing:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
319 data = favicon_fileobj.read(bufsize)
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
320 if len(data) > 0:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
321 self.wfile.write(data)
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
322 else:
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
323 Processing = False
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
324
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
325 favicon_fileobj.close()
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
326
2176
adaf2a92153c added favicon
Richard Jones <richard@users.sourceforge.net>
parents: 2021
diff changeset
327 return
1611
db8545f10476 initial attempt at favicon support, complete failure
Richard Jones <richard@users.sourceforge.net>
parents: 1606
diff changeset
328
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
329 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
330 if i >= 0:
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
331 # 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
332 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
333 else:
4912
a0a7a6ca1586 roundup_server: Code untangle - init `rest` variable when necessary
anatoly techtonik <techtonik@gmail.com>
parents: 4911
diff changeset
334 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
335 query = ''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
336
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
337 # 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
338 if rest == '/':
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
339 self.index()
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
340 return
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
341
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
342 # 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
343 l_path = rest.split('/')
3919
c9cdc4eb8ca5 lowercase tracker name during roundup-server's cgi handling
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3891
diff changeset
344 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
345
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
346 # handle missing trailing '/'
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
347 if len(l_path) == 2:
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
348 self.send_response(301)
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
349 # redirect - XXX https??
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
350 protocol = 'http'
4913
8f6cfe824c9f roundup_server: Fix endless redirect on http://localhost:8917/demo?anything
anatoly techtonik <techtonik@gmail.com>
parents: 4912
diff changeset
351 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
352 if query:
8f6cfe824c9f roundup_server: Fix endless redirect on http://localhost:8917/demo?anything
anatoly techtonik <techtonik@gmail.com>
parents: 4912
diff changeset
353 url += '?' + query
1473
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
354 self.send_header('Location', url)
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
355 self.end_headers()
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
356 self.wfile.write('Moved Permanently')
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
357 return
21a80a8dfc6d fix (again?) trailing / redirect [SF#692910]
Richard Jones <richard@users.sourceforge.net>
parents: 1469
diff changeset
358
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
359 # 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
360 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
361 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
362 else:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
363 rest = '/'
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
364
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
365 # 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
366 env = {}
1251
347657425a10 Nicer display of tracker list in roundup-server [SF#619769]
Richard Jones <richard@users.sourceforge.net>
parents: 1249
diff changeset
367 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
368 env['REQUEST_METHOD'] = self.command
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
369 env['PATH_INFO'] = urllib.unquote(rest)
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
370 if query:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
371 env['QUERY_STRING'] = query
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
372 if self.headers.typeheader is None:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
373 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
374 else:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
375 env['CONTENT_TYPE'] = self.headers.typeheader
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
376 length = self.headers.getheader('content-length')
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
377 if length:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
378 env['CONTENT_LENGTH'] = length
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
379 co = filter(None, self.headers.getheaders('cookie'))
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
380 if co:
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
381 env['HTTP_COOKIE'] = ', '.join(co)
1299
b2d04ce03802 Email improvements.
Richard Jones <richard@users.sourceforge.net>
parents: 1251
diff changeset
382 env['HTTP_AUTHORIZATION'] = self.headers.getheader('authorization')
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
383 env['SCRIPT_NAME'] = ''
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
384 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
385 env['SERVER_PORT'] = str(self.server.server_port)
4290
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
386 try:
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
387 env['HTTP_HOST'] = self.headers ['host']
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
388 except KeyError:
236939e4137b - small typo
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4276
diff changeset
389 env['HTTP_HOST'] = ''
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
390 # 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
391 # headers.
5201
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
392 xfh = self.headers.getheader('X-Forwarded-Host', None)
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
393 if xfh:
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
394 # 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
395 # 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
396 # 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
397 env['HTTP_X-FORWARDED-HOST'] = xfh
5303
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
398 xff = self.headers.getheader('X-Forwarded-For', None)
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
399 if xff:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
400 # 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
401 # 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
402 # 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
403 # 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
404 # 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
405 # 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
406 # 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
407 env['HTTP_X-FORWARDED-FOR'] = xff
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
408 xfp = self.headers.getheader('X-Forwarded-Proto', None)
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
409 if xfp:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
410 # 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
411 # 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
412 # 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
413 # is possible so:
5017c3422334 Pass X-Forwarded-For and X-Forwarded-Proto headers as
John Rouillard <rouilj@ieee.org>
parents: 5266
diff changeset
414 # 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
415 # 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
416 # 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
417 # 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
418 # 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
419 # 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
420 # 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
421 env['HTTP_X-FORWARDED-PROTO'] = xfp
2943
996e2bab8d8a propagate CGI_SHOW_TIMING from os.environ to request environment
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2852
diff changeset
422 if os.environ.has_key('CGI_SHOW_TIMING'):
996e2bab8d8a propagate CGI_SHOW_TIMING from os.environ to request environment
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2852
diff changeset
423 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
424 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
425 referer = self.headers.get('Referer')
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
426 if referer:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
427 env['HTTP_REFERER'] = referer
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
428 origin = self.headers.get('Origin')
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
429 if origin:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
430 env['HTTP_ORIGIN'] = origin
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
431 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
432 if xrw:
a9ace22e0a2f issue 2550690 - Adding anti-csrf measures to roundup following
John Rouillard <rouilj@ieee.org>
parents: 5102
diff changeset
433 env['HTTP_X-REQUESTED-WITH'] = xrw
4475
207499c0a3ed Range support in roundup-server so large files can be served...
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 4344
diff changeset
434 range = self.headers.getheader('range')
207499c0a3ed Range support in roundup-server so large files can be served...
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 4344
diff changeset
435 if range:
207499c0a3ed Range support in roundup-server so large files can be served...
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 4344
diff changeset
436 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
437
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
438 # do the roundup thing
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
439 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
440 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
441
1735
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
442 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
443 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
444 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
445 else:
141d5a0869fa roundup-server now logs IP addresses by default [SF#778795]
Richard Jones <richard@users.sourceforge.net>
parents: 1632
diff changeset
446 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
447 return socket.getfqdn(host)
1632
eb4d04a9d647 added Windows Service mode for roundup-server...
Richard Jones <richard@users.sourceforge.net>
parents: 1611
diff changeset
448
2021
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
449 def log_message(self, format, *args):
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
450 ''' Try to *safely* log to stderr.
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
451 '''
5323
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
452 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
453 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
454
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
455 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
456 (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
457 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
458 format%args))
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
459 else:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
460 try:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
461 BaseHTTPServer.BaseHTTPRequestHandler.log_message(self,
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
462 format, *args)
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
463 except IOError:
762222535a0b Allow http request logs to be logged using the python logging module
John Rouillard <rouilj@ieee.org>
parents: 5303
diff changeset
464 # 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
465 pass
2021
f4a16b186efc proper fix this time
Richard Jones <richard@users.sourceforge.net>
parents: 2020
diff changeset
466
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
467 def start_response(self, headers, response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
468 self.send_response(response)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
469 for key, value in headers:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
470 self.send_header(key, value)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
471 self.end_headers()
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents: 3733
diff changeset
472
1871
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
473 def error():
db97431125a5 Print a nicer error message (without usage)...
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1868
diff changeset
474 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
475 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
476
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
477 def setgid(group):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
478 if group is None:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
479 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
480 if not hasattr(os, 'setgid'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
481 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
482
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
483 # if root, setgid to the running user
3279
6e7462bbafde fix setgid typo [SF#1171346]
Richard Jones <richard@users.sourceforge.net>
parents: 3277
diff changeset
484 if os.getuid():
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
485 print _('WARNING: ignoring "-g" argument, not root')
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
486 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
487
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
488 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
489 import grp
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
490 except ImportError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
491 raise ValueError, _("Can't change groups - no grp module")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
492 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
493 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
494 gid = int(group)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
495 except ValueError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
496 gid = grp.getgrnam(group)[2]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
497 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
498 grp.getgrgid(gid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
499 except KeyError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
500 raise ValueError,_("Group %(group)s doesn't exist")%locals()
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
501 os.setgid(gid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
502
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
503 def setuid(user):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
504 if not hasattr(os, 'getuid'):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
505 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
506
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
507 # People can remove this check if they're really determined
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
508 if user is None:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
509 if os.getuid():
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
510 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
511 raise ValueError, _("Can't run as root!")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
512
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
513 if os.getuid():
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
514 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
515 return
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
516
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
517 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
518 import pwd
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
519 except ImportError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
520 raise ValueError, _("Can't change users - no pwd module")
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
521 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
522 try:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
523 uid = int(user)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
524 except ValueError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
525 uid = pwd.getpwnam(user)[2]
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
526 else:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
527 pwd.getpwuid(uid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
528 except KeyError:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
529 raise ValueError, _("User %(user)s doesn't exist")%locals()
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
530 os.setuid(uid)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
531
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
532 class TrackerHomeOption(configuration.FilePathOption):
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 # Tracker homes do not need any description strings
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
535 def format(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
536 return "%(name)s = %(value)s\n" % {
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
537 "name": self.setting,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
538 "value": self.value2str(self._value),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
539 }
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
540
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
541 class ServerConfig(configuration.Config):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
542
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
543 SETTINGS = (
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
544 ("main", (
4489
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
545 (configuration.Option, "host", "localhost",
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
546 "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
547 "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
548 "will be used.\n"
47bd330e3d17 Fix documentation for roundup-server about the 'host' parameter...
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4475
diff changeset
549 "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
550 "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
551 "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
552 "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
553 "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
554 "in a future release."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
555 (configuration.IntegerNumberOption, "port", DEFAULT_PORT,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
556 "Port to listen on."),
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
557 (configuration.NullableFilePathOption, "favicon", "favicon.ico",
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
558 "Path to favicon.ico image file."
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
559 " If unset, built-in favicon.ico is used."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
560 (configuration.NullableOption, "user", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
561 "User ID as which the server will answer requests.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
562 "In order to use this option, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
563 "the server must be run initially as root.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
564 "Availability: Unix."),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
565 (configuration.NullableOption, "group", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
566 "Group ID as which the server will answer requests.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
567 "In order to use this option, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
568 "the server must be run initially as root.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
569 "Availability: Unix."),
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
570 (configuration.BooleanOption, "nodaemon", "no",
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
571 "don't fork (this overrides the pidfile mechanism)'"),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
572 (configuration.BooleanOption, "log_hostnames", "no",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
573 "Log client machine names instead of IP addresses "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
574 "(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
575 (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
576 "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
577 "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
578 "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
579 "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
580 (configuration.NullableFilePathOption, "pidfile", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
581 "File to which the server records "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
582 "the process id of the daemon.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
583 "If this option is not set, "
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
584 "the server will run in foreground\n"),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
585 (configuration.NullableFilePathOption, "logfile", "",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
586 "Log file path. If unset, log to stderr."),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
587 (configuration.Option, "multiprocess", DEFAULT_MULTIPROCESS,
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
588 "Set processing of each request in separate subprocess.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
589 "Allowed values: %s." % ", ".join(MULTIPROCESS_TYPES)),
3880
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
590 (configuration.NullableFilePathOption, "template", "",
2359d6304a4f Allow template for tracker index page
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3849
diff changeset
591 "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
592 (configuration.BooleanOption, "ssl", "no",
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
593 "Enable SSL support (requires pyopenssl)"),
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
594 (configuration.NullableFilePathOption, "pem", "",
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
595 "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
596 "will be used if left blank."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
597 )),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
598 ("trackers", (), "Roundup trackers to serve.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
599 "Each option in this section defines single Roundup tracker.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
600 "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
601 "Option value is tracker home directory path.\n"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
602 "The path may be either absolute or relative\n"
5102
96dc9f07340a issue2161722: oudated docs
John Rouillard <rouilj@ieee.org>
parents: 4913
diff changeset
603 "to the directory containing this config file."),
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
604 )
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
605
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
606 # options recognized by config
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
607 OPTIONS = {
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
608 "host": "n:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
609 "port": "p:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
610 "group": "g:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
611 "user": "u:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
612 "logfile": "l:",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
613 "pidfile": "d:",
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
614 "nodaemon": "D",
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
615 "log_hostnames": "N",
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
616 "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
617 "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
618 "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
619 "ssl": "s",
1165f2204542 Ooops...not sure where those tabs came from. Making them spaces.
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3883
diff changeset
620 "pem": "e:",
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 def __init__(self, config_file=None):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
624 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
625 self.sections.append("trackers")
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
626
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
627 def _adjust_options(self, config):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
628 """Add options for tracker homes"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
629 # return early if there are no tracker definitions.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
630 # trackers must be specified on the command line.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
631 if not config.has_section("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
632 return
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
633 # config defaults appear in all sections.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
634 # filter them out.
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
635 defaults = config.defaults().keys()
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
636 for name in config.options("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
637 if name not in defaults:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
638 self.add_option(TrackerHomeOption(self, "trackers", name))
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 getopt(self, args, short_options="", long_options=(),
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
641 config_load_options=("C", "config"), **options
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
642 ):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
643 options.update(self.OPTIONS)
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
644 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
645 short_options, long_options, config_load_options, **options)
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
646
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
647 def _get_name(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
648 return "Roundup server"
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
649
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
650 def trackers(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
651 """Return tracker definitions as a list of (name, home) pairs"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
652 trackers = []
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
653 for option in self._get_section_options("trackers"):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
654 trackers.append((option, os.path.abspath(
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
655 self["TRACKERS_" + option.upper()])))
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
656 return trackers
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
657
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
658 def set_logging(self):
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
659 """Initialise logging to the configured file, if any."""
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
660 # appending, unbuffered
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
661 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
662
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
663 def get_server(self):
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
664 """Return HTTP server object to run"""
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
665 # 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
666 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
667
2848
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
668 # 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
669 tracker_homes = self.trackers()
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
670 if self["MULTIPROCESS"] == "debug":
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
671 trackers = None
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
672 else:
2852
37e6ebd5ba29 when preloading trackers (not running in 'debug' mode)...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2848
diff changeset
673 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
674 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
675
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
676 # build customized request handler class
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
677 class RequestHandler(RoundupRequestHandler):
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
678 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
679 TRACKER_HOMES = dict(tracker_homes)
e8cb25c30ac9 added multiprocess mode "debug" - run single process...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2843
diff changeset
680 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
681 DEBUG_MODE = self["MULTIPROCESS"] == "debug"
3438
4963c853d51b added favicon config option (patch [SF#1355661])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3428
diff changeset
682 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
683
4276
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
684 def setup(self):
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
685 if self.CONFIG["SSL"]:
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
686 # 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
687 # 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
688 # 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
689 self.request.do_handshake()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
690 RoundupRequestHandler.setup(self)
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
691
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
692 def finish(self):
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
693 RoundupRequestHandler.finish(self)
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
694 if self.CONFIG["SSL"]:
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
695 self.request.shutdown()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
696 self.request.close()
0c024cf74252 Correct initial- and end-handshakes for SSL
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4273
diff changeset
697
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
698 if self["SSL"]:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
699 base_server = SecureHTTPServer
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
700 else:
4273
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
701 # time out after a minute if we can
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
702 # 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
703 # socket, so we do this only for non-SSL connections.
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
704 if hasattr(socket, 'setdefaulttimeout'):
0a684518d609 More SSL fixes.
Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
parents: 4258
diff changeset
705 socket.setdefaulttimeout(60)
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
706 base_server = BaseHTTPServer.HTTPServer
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
707
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
708 # obtain request server class
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
709 if self["MULTIPROCESS"] not in MULTIPROCESS_TYPES:
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
710 print _("Multiprocess mode \"%s\" is not available, "
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
711 "switching to single-process") % self["MULTIPROCESS"]
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
712 self["MULTIPROCESS"] = "none"
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
713 server_class = base_server
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
714 elif self["MULTIPROCESS"] == "fork":
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
715 class ForkingServer(SocketServer.ForkingMixIn,
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
716 base_server):
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
717 pass
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
718 server_class = ForkingServer
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
719 elif self["MULTIPROCESS"] == "thread":
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
720 class ThreadingServer(SocketServer.ThreadingMixIn,
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
721 base_server):
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
722 pass
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
723 server_class = ThreadingServer
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
724 else:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
725 server_class = base_server
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
726
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
727 # obtain server before changing user id - allows to
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
728 # use port < 1024 if started as root
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
729 try:
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
730 args = ((self["HOST"], self["PORT"]), RequestHandler)
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
731 kwargs = {}
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
732 if self["SSL"]:
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
733 kwargs['ssl_pem'] = self["PEM"]
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
734 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
735 except socket.error as e:
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
736 if e[0] == errno.EADDRINUSE:
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
737 raise socket.error, \
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
738 _("Unable to bind to port %s, port already in use.") \
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
739 % self["PORT"]
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
740 raise
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
741 # change user and/or group
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
742 setgid(self["GROUP"])
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
743 setuid(self["USER"])
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
744 # return the server
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
745 return httpd
2230
ca2664e095be disable forking server when os.fork() not available [SF#938586]
Richard Jones <richard@users.sourceforge.net>
parents: 2200
diff changeset
746
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
747 try:
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
748 import win32serviceutil
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
749 except:
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
750 RoundupService = None
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
751 else:
2230
ca2664e095be disable forking server when os.fork() not available [SF#938586]
Richard Jones <richard@users.sourceforge.net>
parents: 2200
diff changeset
752
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
753 # allow the win32
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
754 import win32service
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
755
5266
e9158c0a6eba Python 2 and 3 support. Convert Exception to BaseException scripts.
John Rouillard <rouilj@ieee.org>
parents: 5248
diff changeset
756 class SvcShutdown(BaseException):
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
757 pass
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
758
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
759 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
760
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
761 _svc_name_ = "roundup"
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
762 _svc_display_name_ = "Roundup Bug Tracker"
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
763
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
764 running = 0
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
765 server = None
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
766
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
767 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
768 import servicemanager
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
769 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
770 config = ServerConfig()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
771 (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
772 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
773 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
774 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
775 (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
776 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
777 return
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
778 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
779 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
780 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
781 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
782 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
783 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
784 " 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
785 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
786 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
787 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
788 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
789 (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
790 self.ReportServiceStatus(win32service.SERVICE_STOPPED)
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
791
2840
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
792 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
793 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
794 # 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
795 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
796 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
797 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
798 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
799 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
800 sock.close()
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
801 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
802
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
803 def usage(message=''):
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
804 if RoundupService:
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
805 os_part = \
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
806 ""''' -c <Command> Windows Service options.
2521
8822780fa519 mark non-windows usage part for translation;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2483
diff changeset
807 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
808 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
809 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
810 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
811 specifics.'''
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
812 else:
2521
8822780fa519 mark non-windows usage part for translation;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2483
diff changeset
813 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
814 -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
815 -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
816 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
817 specified if -d is used.'''
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
818 if message:
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
819 message += '\n'
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
820 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
821
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
822 Options:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
823 -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
824 -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
825 -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
826 -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
827 -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
828 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
829 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
830 to all network interfaces
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
831 -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
832 -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
833 -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
834 -i <fname> set tracker index template
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
835 -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
836 -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
837 -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
838 -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
839 Allowed values: %(mp_types)s.
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
840 %(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
841
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
842 Long options:
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
843 --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
844 --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
845 --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
846 --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
847 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
848 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
849
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
850 Examples:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
851
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
852 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
853 -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
854 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
855
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
856 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
857
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
858 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
859
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
860 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
861 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
862
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
863 Configuration file format:
2842
98e2e7b57101 roundup service name changed to single word "roundup"...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2840
diff changeset
864 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
865 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
866 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
867 for option descriptions.
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
868
2483
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
869 How to use "name=tracker home":
55b496fb7b5b better roundup-server usage string [SF#973352]
Richard Jones <richard@users.sourceforge.net>
parents: 2481
diff changeset
870 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
871 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
872 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
873 "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
874 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
875 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
876 ''') % {
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
877 "message": message,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
878 "os_part": os_part,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
879 "port": DEFAULT_PORT,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
880 "mp_def": DEFAULT_MULTIPROCESS,
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
881 "mp_types": ", ".join(MULTIPROCESS_TYPES),
46ad912ddd2b describe -t option in help; remove unused win32 imports
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2842
diff changeset
882 }
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
883
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
884
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
885 def writepidfile(pidfile):
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
886 ''' 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
887 pid = os.getpid()
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
888 if pid:
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
889 pidfile = open(pidfile, 'w')
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
890 pidfile.write(str(pid))
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
891 pidfile.close()
3784
93dfda74a763 allow use of roundup-server pidfile without forking [SF#1614753]
Richard Jones <richard@users.sourceforge.net>
parents: 3736
diff changeset
892
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
893 def daemonize(pidfile):
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
894 ''' Turn this process into a daemon.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
895 - 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
896 - make our parent PID 1
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
897
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
898 Write our new PID to the pidfile.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
899
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
900 From A.M. Kuuchling (possibly originally Greg Ward) with
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
901 modification from Oren Tirosh, and finally a small mod from me.
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
902 '''
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
903 # Fork once
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
904 if os.fork() != 0:
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
905 os._exit(0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
906
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
907 # Create new session
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
908 os.setsid()
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
909
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
910 # Second fork to force PPID=1
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
911 pid = os.fork()
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
912 if pid:
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
913 pidfile = open(pidfile, 'w')
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
914 pidfile.write(str(pid))
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
915 pidfile.close()
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
916 os._exit(0)
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
917
2186
3f89c8ffe4f1 version info in scripts
Richard Jones <richard@users.sourceforge.net>
parents: 2181
diff changeset
918 os.chdir("/")
1072
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
919
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
920 # 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
921 # descriptors can't be used again
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
922 devnull = os.open('/dev/null', 0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
923 os.dup2(devnull, 0)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
924 os.dup2(devnull, 1)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
925 os.dup2(devnull, 2)
88ded00fa0e0 better daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 1047
diff changeset
926
2637
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
927 undefined = []
11811b313459 The demo.py script works again using the new configuration system.
Richard Jones <richard@users.sourceforge.net>
parents: 2633
diff changeset
928 def run(port=undefined, success_message=None):
1249
6c24a86a12ae Fixes for SourceForge tracker bugs.
Richard Jones <richard@users.sourceforge.net>
parents: 1183
diff changeset
929 ''' 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
930 '''
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
931 config = ServerConfig()
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
932 # additional options
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
933 short_options = "hvS"
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
934 if RoundupService:
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
935 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
936 try:
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
937 (optlist, args) = config.getopt(sys.argv[1:],
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
938 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
939 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
940 usage(str(e))
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
941 return
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
942
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
943 # 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
944 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
945 # 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
946 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
947 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
948 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
949 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
950 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
951 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
952 long_name += "="
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
953 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
954 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
955 svc_args = []
a212699c21f2 windows service part rewritten to take in account command line options;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2838
diff changeset
956 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
957 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
958 # 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
959 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
960 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
961 # 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
962 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
963 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
964 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
965 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
966 # pass the control to serviceutil
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
967 win32serviceutil.HandleCommandLine(RoundupService,
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
968 argv=sys.argv[:1] + args)
2838
91b2d50f0b1a eliminate as many pychecker warnings as possible:
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2835
diff changeset
969 return
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
970
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
971 # add tracker names from command line.
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
972 # 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
973 if args:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
974 for arg in args:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
975 try:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
976 name, home = arg.split('=')
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
977 except ValueError:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
978 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
979 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
980 config["TRACKERS_" + name.upper()] = home
2308
e21c3a447a62 translate "cannot fork" error message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2287
diff changeset
981
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
982 # handle remaining options
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
983 if optlist:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
984 for (opt, arg) in optlist:
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
985 if opt in ("-h", "--help"):
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
986 usage()
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
987 elif opt in ("-v", "--version"):
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
988 print '%s (python %s)' % (roundup_version,
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
989 sys.version.split()[0])
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
990 elif opt in ("-S", "--save-config"):
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
991 config.save()
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
992 print _("Configuration saved to %s") % config.filepath
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
993 # 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
994 return
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
995
2774
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
996 # 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
997 if port is not undefined:
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
998 config.PORT = port
22c381f3f448 respect function argument 'port' in run()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2773
diff changeset
999
3112
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1000 if config["LOGFILE"]:
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1001 config["LOGFILE"] = os.path.abspath(config["LOGFILE"])
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1002 # switch logging from stderr/stdout to logfile
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1003 config.set_logging()
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1004 if config["PIDFILE"]:
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1005 config["PIDFILE"] = os.path.abspath(config["PIDFILE"])
a7657b3cd22a merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3022
diff changeset
1006
2632
9c55f2bc5961 roundup-server now has a configuration file (-C option)
Richard Jones <richard@users.sourceforge.net>
parents: 2592
diff changeset
1007 # 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
1008 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
1009 if not hasattr(os, 'fork'):
2308
e21c3a447a62 translate "cannot fork" error message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2287
diff changeset
1010 print _("Sorry, you can't run the server as a daemon"
e21c3a447a62 translate "cannot fork" error message
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2287
diff changeset
1011 " 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
1012 sys.exit(0)
1632
eb4d04a9d647 added Windows Service mode for roundup-server...
Richard Jones <richard@users.sourceforge.net>
parents: 1611
diff changeset
1013 else:
3787
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1014 if config['NODAEMON']:
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1015 writepidfile(config["PIDFILE"])
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1016 else:
f623bdafe44b expand tabs
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3784
diff changeset
1017 daemonize(config["PIDFILE"])
1953
800b226bba58 fix roundup win service
Richard Jones <richard@users.sourceforge.net>
parents: 1939
diff changeset
1018
2835
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
1019 # create the server
9a6b451b1ba6 implement threading server;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2774
diff changeset
1020 httpd = config.get_server()
1047
1890c611de08 add daemonification
Richard Jones <richard@users.sourceforge.net>
parents: 992
diff changeset
1021
1868
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1022 if success_message:
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1023 print success_message
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1024 else:
2771
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1025 print _('Roundup server started on %(HOST)s:%(PORT)s') \
d385f6c1d4ed let config handle command line options.
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2676
diff changeset
1026 % config
1868
1545a36ae887 Use roundup_server script in demo.py to reduce duplication
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1867
diff changeset
1027
1311
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1028 try:
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1029 httpd.serve_forever()
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1030 except KeyboardInterrupt:
7c9fda4a6692 handle KeyboardInterrupt nicely
Richard Jones <richard@users.sourceforge.net>
parents: 1299
diff changeset
1031 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
1032
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1033 if __name__ == '__main__':
593
2256f81293c1 Conversion to generated script stubs
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 592
diff changeset
1034 run()
592
326388b8604a Moved scripts from top-level dir to roundup.scripts subpackage
Jürgen Hermann <jhermann@users.sourceforge.net>
parents:
diff changeset
1035
3883
679118b572d5 add SSL to roundup-server via pyopenssl
Justus Pendleton <jpend@users.sourceforge.net>
parents: 3880
diff changeset
1036 # vim: sts=4 sw=4 et si

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