Hello community, here is the log from the commit of package apache2-mod_wsgi for openSUSE:Factory checked in at 2015-08-28 08:26:03 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/apache2-mod_wsgi (Old) and /work/SRC/openSUSE:Factory/.apache2-mod_wsgi.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "apache2-mod_wsgi" Changes: -------- New Changes file: --- /dev/null 2015-08-24 19:43:32.284261900 +0200 +++ /work/SRC/openSUSE:Factory/.apache2-mod_wsgi.new/apache2-mod_wsgi-python3.changes 2015-08-28 08:26:04.000000000 +0200 @@ -0,0 +1,154 @@ +------------------------------------------------------------------- +Sat Aug 15 17:56:30 CEST 2015 - m...@suse.de + +- update to 4.4.8 +- seperate package for python3 to fix module loading errors +- conflict with mod_wsgi + +------------------------------------------------------------------- +Thu Aug 6 13:07:16 UTC 2015 - m...@suse.com + +- Build subpackage with mod_wsgi_python3 (bsc#939717) + +------------------------------------------------------------------- +Thu Jul 16 07:22:02 UTC 2015 - pgaj...@suse.com + +- Requries: %{apache_suse_maintenance_mmn} + This will pull this module to the update (in released distribution) + when apache maintainer thinks it is good (due api/abi changes). + +------------------------------------------------------------------- +Fri Jan 30 18:12:20 UTC 2015 - rjsch...@suse.com + +- Fix build failure on SLE 12 (Apache 2.4.10) + + add wsgi_fixVersionCheck.patch + + build failed due to improper version check + +------------------------------------------------------------------- +Thu Jan 29 23:52:14 UTC 2015 - rjsch...@suse.com + +- Update to version 4.4.6 + - Upstream release notes: + + http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.4.6.html + + http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.4.5.html + + http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.4.4.html + ..... + - As of version 4.2.7 mod_wsgi is effected by + https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=758035 + +------------------------------------------------------------------- +Mon Nov 3 09:53:08 UTC 2014 - pgaj...@suse.com + +- call spec-cleaner +- use apache rpm macros + +------------------------------------------------------------------- +Thu Jul 10 08:43:08 CEST 2014 - m...@suse.de + +- change URL to new location + +------------------------------------------------------------------- +Wed Jul 9 14:13:29 CEST 2014 - m...@suse.de + +- provide short module name + +------------------------------------------------------------------- +Wed Jul 9 11:34:41 CEST 2014 - m...@suse.de + +- Update to version 4.2.5 + - remove mod_wsgi-3.4-connsbh.patch - included in upstream version + - remove mod_wsgi-setuid-patch.diff - included in upstream version + - No longer support the use of mod_python in conjunction with + mod_wsgi + - Adding a lot of new configuration option + - fix off-by-one error in setgroups (bnc#883229) + +------------------------------------------------------------------- +Sat May 24 13:49:13 UTC 2014 - m...@suse.com + +- fix Local privilege escalation (bnc#878550) + CVE-2014-0240 + +------------------------------------------------------------------- +Mon Apr 28 20:16:57 UTC 2014 - adaugher...@tamu.edu + +- Fix module name sent to a2enmod/a2dismod and fix/cleanup + post/postun scripts. + +------------------------------------------------------------------- +Sat Nov 30 12:28:43 UTC 2013 - ag...@suse.com + +- Add patch "mod_wsgi-3.4-connsbh.patch" to fix segmentation faults + with apache 2.4 (https://bugzilla.redhat.com/show_bug.cgi?id=831701) + +------------------------------------------------------------------- +Wed Jan 30 14:39:38 UTC 2013 - dims...@opensuse.org + +- Update to version 3.4: + + New support for Apache 2.4 + + Support for Python 3.2 + + Is now guaranteed that mod_ssl access handler is run before + that for mod_wsgi so that any per request variables setup by + mod_ssl are available in the mod_wsgi access handler as + implemented by WSGIAccessScript directive. + + Added 'python-home' option to WSGIDaemonProcess. + + Added 'lang' and 'locale' options to WSGIDaemonProcess. + + Split combined WWW-Authenticate header returned from daemon + process back into separate headers. +- Introduce build compatibility with apache 2.4: apxs2 was moved + from %{_sbindir} to %{_bindir} + +------------------------------------------------------------------- +Fri Nov 16 08:06:08 UTC 2012 - sasc...@suse.de + +- Require apache2, a module makes little sense without + +------------------------------------------------------------------- +Fri Dec 16 12:59:15 UTC 2011 - ch...@computersalat.de + +- add post/postun section + * enable module after install (a2enmod) + * disable module after deinstall (a2enmod -d) +- fix License as required by http://spdx.org/licenses/ + * Apache-2.0 +- fix build for CentOS/RHEL +- spec-cleanup + +------------------------------------------------------------------- +Sat Sep 17 11:21:55 UTC 2011 - jeng...@medozas.de + +- Remove redundant tags/sections from specfile +- Use %_smp_mflags for parallel build + +------------------------------------------------------------------- +Wed Oct 27 02:18:42 UTC 2010 - ter...@gmail.com + +- update to 3.3: + http://code.google.com/p/modwsgi/wiki/ChangesInVersion0303 + +------------------------------------------------------------------- +Wed May 13 12:00:59 CEST 2009 - pascal.ble...@opensuse.org + +- update to 2.5: + http://code.google.com/p/modwsgi/wiki/ChangesInVersion0205 + +- minor spec file fixes (use %configure, -j%jobs) + +------------------------------------------------------------------- +Wed Sep 17 16:35:58 CEST 2008 - po...@suse.de + +- update to 2.3. Changelog: + http://code.google.com/p/modwsgi/wiki/ChangesInVersion0202 + http://code.google.com/p/modwsgi/wiki/ChangesInVersion0203 + +------------------------------------------------------------------- +Fri Aug 8 14:29:26 CEST 2008 - po...@suse.de + +- update to 2.1. Changelog: + http://code.google.com/p/modwsgi/wiki/ChangesInVersion0201 + +------------------------------------------------------------------- +Tue Mar 11 15:40:46 CET 2008 - po...@suse.de + +- initial package (version 1.3) + --- /work/SRC/openSUSE:Factory/apache2-mod_wsgi/apache2-mod_wsgi.changes 2015-08-07 00:24:55.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.apache2-mod_wsgi.new/apache2-mod_wsgi.changes 2015-08-28 08:26:04.000000000 +0200 @@ -1,0 +2,10 @@ +Sat Aug 15 17:55:03 CEST 2015 - m...@suse.de + +- update to 4.4.8 + * Upstream release notes: + + http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.4.7.html + + http://modwsgi.readthedocs.org/en/latest/release-notes/version-4.4.8.html +- seperate package for python3 to fix module loading errors +- conflict with mod_wsgi-python3 + +------------------------------------------------------------------- Old: ---- mod_wsgi-4.4.6.tar.gz New: ---- apache2-mod_wsgi-python3.changes apache2-mod_wsgi-python3.spec mod_wsgi-4.4.8.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ apache2-mod_wsgi-python3.spec ++++++ # # spec file for package apache2-mod_wsgi-python3 # # Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via http://bugs.opensuse.org/ # %define modname mod_wsgi Name: apache2-mod_wsgi-python3 Version: 4.4.8 Release: 0 Summary: A WSGI interface for Python3 web applications in Apache License: Apache-2.0 Group: Productivity/Networking/Web/Servers Url: https://github.com/GrahamDumpleton/mod_wsgi #Source: https://github.com/GrahamDumpleton/mod_wsgi/archive/%%{version}.tar.gz Source: %{modname}-%{version}.tar.gz ## Work around for inconsistent Apache source tree in SLE 12, see bnc#915479 Patch0: wsgi_fixVersionCheck.patch BuildRequires: python3-devel Provides: %{modname} = %{version}-%{release} BuildRoot: %{_tmppath}/%{name}-%{version}-build %if 0%{?suse_version} BuildRequires: apache-rpm-macros BuildRequires: apache2-devel %else %define apache_apxs %{bindir}/apxs %define apache_sysconfdir %(%{apache_apxs} -q PREFIX) BuildRequires: httpd BuildRequires: httpd-devel %endif %if 0%{?suse_version} Requires: %{apache_mmn} Requires: %{apache_suse_maintenance_mmn} Requires: apache2 %else Requires: httpd %endif Conflicts: apache2-mod_wsgi %description The mod_wsgi adapter is an Apacheache module that provides a WSGI compliant interface for hosting Python based web applications within Apache. The adapter is writtentten completely in C code against the Apache C runtime and for hosting WSGI applications within Apache has a lower overhead than using existing WSGI adapters for mod_python or CGI. %prep %setup -q -n %{modname}-%{version} %patch0 -p1 %build export CFLAGS="%{optflags} -fno-strict-aliasing" %configure \ %if 0%{?suse_version} --with-apxs="%{apache_apxs}-prefork" \ %else --with-apxs="%{apache_apxs}" \ %endif --with-python="python3" make %{?_smp_mflags} %install make install DESTDIR=%{buildroot} LIBEXECDIR=%{apache_libexecdir} %post %if 0%{?suse_version} if ! %{_sbindir}/a2enmod -q wsgi; then %{_sbindir}/a2enmod wsgi fi %endif %postun %if 0%{?suse_version} if [ "$1" = "0" ]; then if a2enmod -q wsgi; then %{_sbindir}/a2enmod -d wsgi fi fi %endif %files %defattr(-,root,root) %doc LICENSE README.rst docs/release-notes %dir %{apache_libexecdir} %{apache_libexecdir}/%{modname}.so %changelog ++++++ apache2-mod_wsgi.spec ++++++ --- /var/tmp/diff_new_pack.nEBAn8/_old 2015-08-28 08:26:05.000000000 +0200 +++ /var/tmp/diff_new_pack.nEBAn8/_new 2015-08-28 08:26:05.000000000 +0200 @@ -16,10 +16,9 @@ # -%define py3dir %_builddir/py3 %define modname mod_wsgi Name: apache2-mod_wsgi -Version: 4.4.6 +Version: 4.4.8 Release: 0 Summary: Python WSGI adapter module for Apache License: Apache-2.0 @@ -48,38 +47,16 @@ %else Requires: httpd %endif +Conflicts: apache2-mod_wsgi-python3 %description The aim of mod_wsgi is to implement a simple to use Apache module which can host any Python application which supports the Python WSGI interface. -%package python3 -Summary: A WSGI interface for Python3 web applications in Apache -Group: System Environment/Libraries -BuildRequires: python3-devel -%if 0%{?suse_version} -Requires: %{apache_mmn} -Requires: %{apache_suse_maintenance_mmn} -Requires: apache2 -%else -Requires: httpd -%endif - -%description python3 -The mod_wsgi adapter is an Apacheache module that provides a WSGI compliant -interface for hosting Python based web applications within Apache. The -adapter is writtentten completely in C code against the Apache C runtime and -for hosting WSGI applications within Apache has a lower overhead than using -existing WSGI adapters for mod_python or CGI. - - %prep %setup -q -n %{modname}-%{version} %patch0 -p1 -mkdir -p %{py3dir} -cp -a . %{py3dir} - %build export CFLAGS="%{optflags} -fno-strict-aliasing" %configure \ @@ -91,23 +68,7 @@ --with-python="python" make %{?_smp_mflags} -pushd %{py3dir} -%configure \ -%if 0%{?suse_version} - --with-apxs="%{apache_apxs}-prefork" \ -%else - --with-apxs="%{apache_apxs}" \ -%endif - --with-python="python3" -make %{?_smp_mflags} -popd - %install -pushd %{py3dir} -make install DESTDIR=$RPM_BUILD_ROOT LIBEXECDIR=%{apache_libexecdir} -mv $RPM_BUILD_ROOT%{apache_libexecdir}/mod_wsgi{,_python3}.so -popd - make install DESTDIR=%{buildroot} LIBEXECDIR=%{apache_libexecdir} %post @@ -126,32 +87,10 @@ fi %endif -%post python3 -%if 0%{?suse_version} -if ! %{_sbindir}/a2enmod -q wsgi_python3; then - %{_sbindir}/a2enmod wsgi_python3 -fi -%endif - -%postun python3 -%if 0%{?suse_version} -if [ "$1" = "0" ]; then - if a2enmod -q wsgi_python3; then - %{_sbindir}/a2enmod -d wsgi_python3 - fi -fi -%endif - %files %defattr(-,root,root) %doc LICENSE README.rst docs/release-notes %dir %{apache_libexecdir} %{apache_libexecdir}/%{modname}.so -%files python3 -%defattr(-,root,root) -%doc LICENSE README.rst docs/release-notes -%dir %{apache_libexecdir} -%{apache_libexecdir}/%{modname}_python3.so - %changelog ++++++ mod_wsgi-4.4.6.tar.gz -> mod_wsgi-4.4.8.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/docs/release-notes/index.rst new/mod_wsgi-4.4.8/docs/release-notes/index.rst --- old/mod_wsgi-4.4.6/docs/release-notes/index.rst 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/docs/release-notes/index.rst 2015-02-08 10:34:19.000000000 +0100 @@ -5,6 +5,8 @@ .. toctree:: :maxdepth: 2 + version-4.4.8.rst + version-4.4.7.rst version-4.4.6.rst version-4.4.5.rst version-4.4.4.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/docs/release-notes/version-4.4.7.rst new/mod_wsgi-4.4.8/docs/release-notes/version-4.4.7.rst --- old/mod_wsgi-4.4.6/docs/release-notes/version-4.4.7.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/mod_wsgi-4.4.8/docs/release-notes/version-4.4.7.rst 2015-02-08 10:34:19.000000000 +0100 @@ -0,0 +1,69 @@ +============= +Version 4.4.7 +============= + +Version 4.4.7 of mod_wsgi can be obtained from: + + https://codeload.github.com/GrahamDumpleton/mod_wsgi/tar.gz/4.4.7 + +For details on the availability of Windows binaries see: + + https://github.com/GrahamDumpleton/mod_wsgi/tree/master/win32 + +Features Changed +---------------- + +1. The ``proxy-buffer-size`` option to ``WSGIDaemonProcess`` directive +was renamed to ``response-buffer-size`` to avoid confusion with options +related to normal HTTP proxying. The ``--proxy-buffer-size`` option of +``mod_wsgi-express`` was similarly renamed to ``--response-buffer-size``. + +New Features +------------ + +1. Added ``--service-script`` option to ``mod_wsgi-express`` to allow a +Python script to be loaded and executed in the context of a distinct +daemon process. This can be used for executing a service to be managed by +Apache, even though it is a distinct application. The options take two +arguments, a short name for the service and the path to the Python script +for starting the service. + +If ``mod_wsgi-express`` is being run as root, then a user and group can be +specified for the service using the ``--service-user`` and +``--service-group`` options. The options take two arguments, a short name +for the service and the user or group name respectively. + +2. Added ``--proxy-url-alias`` option to ``mod_wsgi-express`` for setting +up proxying of a sub URL of the site to a remote URL. + +3. Added ``--proxy-virtual-host`` option to ``mod_wsgi-express`` for setting +up proxying of a whole virtual host to a remote URL. Only supports proxying +of HTTP requests and not HTTPS requests. + +4. Added ``eviction-timeout`` option to ``WSGIDaemonProcess`` directive. +For the case where the graceful restart signal, usually ``SIGUSR1``, is +sent to a daemon process to evict the WSGI application and restart the +process, this controls how many seconds the process will wait, while still +accepting new requests, before it reaches an idle state with no active +requests and shuts down. + +The ``graceful-timeout`` option previously performed this exact role in +this case previously, but a separate option is being added to allow a +different timeout period to be specified for the case for forced eviction. +The existing ``graceful-timeout`` option is still used when a maximum +requests option or CPU usage limit is set. For backwards compatibility, +if ``eviction-timeout`` isn't set, it will fall back to using any value +specified using the ``graceful-timeout`` option. + +The ``--eviction-timeout`` option has also been added to +``mod_wsgi-express`` and behaves in a similar fashion. + +5. Added support for new ``mod_wsgi-httpd`` package. The ``mod_wsgi-httpd`` +package is a pip installable package which will build the Apache httpd +server and install it into the Python installation. If the +``mod_wsgi-httpd`` package is installed before installing this package, +then the Apache httpd server installation installed by ``mod_wsgi-httpd`` +will be used instead of any system installed version of the Apache httpd +server when running ``mod_wsgi-express``. This allows you to workaround +any inability to upgrade the main Apache installation, or install its 'dev' +package if missing, or install it outright if not present. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/docs/release-notes/version-4.4.8.rst new/mod_wsgi-4.4.8/docs/release-notes/version-4.4.8.rst --- old/mod_wsgi-4.4.6/docs/release-notes/version-4.4.8.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/mod_wsgi-4.4.8/docs/release-notes/version-4.4.8.rst 2015-02-08 10:34:19.000000000 +0100 @@ -0,0 +1,34 @@ +============= +Version 4.4.8 +============= + +Version 4.4.8 of mod_wsgi can be obtained from: + + https://codeload.github.com/GrahamDumpleton/mod_wsgi/tar.gz/4.4.8 + +For details on the availability of Windows binaries see: + + https://github.com/GrahamDumpleton/mod_wsgi/tree/master/win32 + +Bugs Fixed +---------- + +1. The eviction timeout was not being correctly applied when request timeout +wasn't being applied at the same time. It may have partly worked if any of +inactivity or graceful timeout were also specified, but the application of +the timeout may still have been delayed. + +New Features +------------ + +1. Added the ``--error-log-name`` option to ``mod_wsgi-express`` to allow +the name of the file used for the error log, when being written to the log +directory, to be overridden. + +2. Added the ``--access-log-name`` option to ``mod_wsgi-express`` to allow +the name of the file used for the access log, when being written to the log +directory, to be overridden. + +3. Added the ``--startup-log-name`` option to ``mod_wsgi-express`` to allow +the name of the file used for the startup log, when being written to the log +directory, to be overridden. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/setup.py new/mod_wsgi-4.4.8/setup.py --- old/mod_wsgi-4.4.6/setup.py 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/setup.py 2015-02-08 10:34:19.000000000 +0100 @@ -19,49 +19,48 @@ from distutils.sysconfig import get_config_var as get_python_config from distutils.sysconfig import get_python_lib -# Before anything else, this setup.py uses various tricks to install -# precompiled Apache binaries for the Heroku and OpenShift environments. -# Once they are installed, then the installation of the mod_wsgi package -# itself will be triggered, ensuring that it can be built against the -# precompiled Apache binaries which were installed. +# Before anything else, this setup.py uses some tricks to potentially +# install Apache. This can be from a local tarball, or from precompiled +# Apache binaries for Heroku and OpenShift environments downloaded from +# Amazon S3. Once they are installed, then the installation of the +# mod_wsgi package itself will be triggered, ensuring that it can be +# built against the precompiled Apache binaries which were installed. # -# We therefore first need to work out whether we are actually running on -# either Heroku of OpenShift. If we are, then we identify the set of -# precompiled binaries we are to use and copy it into the Python -# installation. +# First work out whether we are actually running on either Heroku or +# OpenShift. If we are, then we identify the set of precompiled binaries +# we are to use and copy it into the Python installation. PREFIX = 'https://s3.amazonaws.com' BUCKET = os.environ.get('MOD_WSGI_REMOTE_S3_BUCKET_NAME', 'modwsgi.org') REMOTE_TARBALL_NAME = os.environ.get('MOD_WSGI_REMOTE_PACKAGES_NAME') +LOCAL_TARBALL_FILE = os.environ.get('MOD_WSGI_LOCAL_PACKAGES_FILE') TGZ_OPENSHIFT='mod_wsgi-packages-openshift-centos6-apache-2.4.10-1.tar.gz' TGZ_HEROKU='mod_wsgi-packages-heroku-cedar14-apache-2.4.10-1.tar.gz' -if not REMOTE_TARBALL_NAME: +if not REMOTE_TARBALL_NAME and not LOCAL_TARBALL_FILE: if os.environ.get('OPENSHIFT_HOMEDIR'): REMOTE_TARBALL_NAME = TGZ_OPENSHIFT elif os.path.isdir('/app/.heroku'): REMOTE_TARBALL_NAME = TGZ_HEROKU -LOCAL_TARBALL_FILE = os.environ.get('MOD_WSGI_LOCAL_PACKAGES_FILE') - REMOTE_TARBALL_URL = None if LOCAL_TARBALL_FILE is None and REMOTE_TARBALL_NAME: REMOTE_TARBALL_URL = '%s/%s/%s' % (PREFIX, BUCKET, REMOTE_TARBALL_NAME) -WITH_PACKAGES = False +WITH_TARBALL_PACKAGE = False if REMOTE_TARBALL_URL or LOCAL_TARBALL_FILE: - WITH_PACKAGES = True + WITH_TARBALL_PACKAGE = True # If we are doing an install, download the tarball and unpack it into # the 'packages' subdirectory. We will then add everything in that # directory as package data so that it will be installed into the Python # installation. -if WITH_PACKAGES: +if WITH_TARBALL_PACKAGE: if REMOTE_TARBALL_URL: if not os.path.isfile(REMOTE_TARBALL_NAME): print('Downloading', REMOTE_TARBALL_URL) @@ -69,11 +68,12 @@ os.rename(REMOTE_TARBALL_NAME+'.download', REMOTE_TARBALL_NAME) LOCAL_TARBALL_FILE = REMOTE_TARBALL_NAME - shutil.rmtree('src/packages', ignore_errors=True) + if LOCAL_TARBALL_FILE: + shutil.rmtree('src/packages', ignore_errors=True) - tar = tarfile.open(LOCAL_TARBALL_FILE) - tar.extractall('src/packages') - tar.close() + tar = tarfile.open(LOCAL_TARBALL_FILE) + tar.extractall('src/packages') + tar.close() open('src/packages/__init__.py', 'a').close() @@ -119,19 +119,27 @@ APXS = os.environ.get('APXS') +WITH_HTTPD_PACKAGE = False + +if APXS is None: + APXS = find_program(['mod_wsgi-apxs']) + if APXS is not None: + WITH_HTTPD_PACKAGE = True + if APXS is None: - APXS = find_program(['apxs2', 'apxs'], 'apxs', ['/usr/sbin', os.getcwd()]) + APXS = find_program(['mod_wsgi-apxs', 'apxs2', 'apxs'], + 'apxs', ['/usr/sbin', os.getcwd()]) elif not os.path.isabs(APXS): APXS = find_program([APXS], APXS, ['/usr/sbin', os.getcwd()]) -if not WITH_PACKAGES: +if not WITH_TARBALL_PACKAGE: if not os.path.isabs(APXS) or not os.access(APXS, os.X_OK): raise RuntimeError('The %r command appears not to be installed or ' 'is not executable. Please check the list of prerequisites ' 'in the documentation for this package and install any ' 'missing Apache httpd server packages.' % APXS) -if WITH_PACKAGES: +if WITH_TARBALL_PACKAGE: SCRIPT_DIR = os.path.join(os.path.dirname(__file__), 'src', 'packages') CONFIG_FILE = os.path.join(SCRIPT_DIR, 'apache/build/config_vars.mk') @@ -189,29 +197,6 @@ CONFIG['SBINDIR'] = get_apxs_config('sbindir') CONFIG['PROGNAME'] = get_apxs_config('progname') - _CFLAGS_NAMES = ['SHLTCFLAGS', 'CFLAGS', 'NOTEST_CPPFLAGS', - 'EXTRA_CPPFLAGS', 'EXTRA_CFLAGS'] - - _CFLAGS_VALUES = [] - - for name in _CFLAGS_NAMES: - value = get_apxs_config(name) - - # Heroku doesn't appear to run the same version of gcc - # that a standard Ubuntu installation does and which was - # used to originally build the Apache binaries. We need - # therefore to strip out flags that the Heroku gcc may - # not understand. - - if value: - if os.path.isdir('/app/.heroku'): - value = value.replace('-prefer-pic', '') - - if value: - _CFLAGS_VALUES.append(value) - - CONFIG['CFLAGS'] = ' '.join(_CFLAGS_VALUES) - else: def get_apxs_config(query): p = subprocess.Popen([APXS, '-q', query], @@ -248,18 +233,31 @@ APXS_CONFIG_TEMPLATE = """ import os -WITH_PACKAGES = %(WITH_PACKAGES)r +WITH_TARBALL_PACKAGE = %(WITH_TARBALL_PACKAGE)r +WITH_HTTPD_PACKAGE = %(WITH_HTTPD_PACKAGE)r -if WITH_PACKAGES: - import mod_wsgi.packages - PACKAGES = os.path.join(os.path.dirname(mod_wsgi.packages.__file__)) - BINDIR = os.path.join(PACKAGES, 'apache', 'bin') +if WITH_HTTPD_PACKAGE: + from mod_wsgi_packages.httpd import __file__ as PACKAGES_ROOTDIR + PACKAGES_ROOTDIR = os.path.dirname(PACKAGES_ROOTDIR) + BINDIR = os.path.join(PACKAGES_ROOTDIR, 'bin') + SBINDIR = BINDIR + LIBEXECDIR = os.path.join(PACKAGES_ROOTDIR, 'modules') + SHLIBPATH = os.path.join(PACKAGES_ROOTDIR, 'lib') +elif WITH_TARBALL_PACKAGE: + from mod_wsgi.packages import __file__ as PACKAGES_ROOTDIR + PACKAGES_ROOTDIR = os.path.dirname(PACKAGES_ROOTDIR) + BINDIR = os.path.join(PACKAGES_ROOTDIR, 'apache', 'bin') SBINDIR = BINDIR - LIBEXECDIR = os.path.join(PACKAGES, 'apache', 'modules') + LIBEXECDIR = os.path.join(PACKAGES_ROOTDIR, 'apache', 'modules') + SHLIBPATH = [] + SHLIBPATH.append(os.path.join(PACKAGES_ROOTDIR, 'apr-util', 'lib')) + SHLIBPATH.append(os.path.join(PACKAGES_ROOTDIR, 'apr', 'lib')) + SHLIBPATH = ':'.join(SHLIBPATH) else: BINDIR = '%(BINDIR)s' SBINDIR = '%(SBINDIR)s' LIBEXECDIR = '%(LIBEXECDIR)s' + SHLIBPATH = '' MPM_NAME = '%(MPM_NAME)s' PROGNAME = '%(PROGNAME)s' @@ -282,7 +280,9 @@ with open(os.path.join(os.path.dirname(__file__), 'src/server/apxs_config.py'), 'w') as fp: - print(APXS_CONFIG_TEMPLATE % dict(WITH_PACKAGES=WITH_PACKAGES, + print(APXS_CONFIG_TEMPLATE % dict( + WITH_TARBALL_PACKAGE=WITH_TARBALL_PACKAGE, + WITH_HTTPD_PACKAGE=WITH_HTTPD_PACKAGE, BINDIR=BINDIR, SBINDIR=SBINDIR, LIBEXECDIR=LIBEXECDIR, MPM_NAME=MPM_NAME, PROGNAME=PROGNAME, SHLIBPATH_VAR=SHLIBPATH_VAR), file=fp) @@ -429,5 +429,4 @@ ext_modules = [extension], entry_points = { 'console_scripts': ['mod_wsgi-express = mod_wsgi.server:main'],}, - install_requires = ['mod_wsgi-metrics >= 1.0.0'], ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/src/server/__init__.py new/mod_wsgi-4.4.8/src/server/__init__.py --- old/mod_wsgi-4.4.6/src/server/__init__.py 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/src/server/__init__.py 2015-02-08 10:34:19.000000000 +0100 @@ -77,7 +77,7 @@ APACHE_GENERAL_CONFIG = """ <IfModule !version_module> -LoadModule version_module '%(modules_directory)s/mod_version.so' +LoadModule version_module '${HTTPD_MODULES_DIRECTORY}/mod_version.so' </IfModule> ServerName %(host)s @@ -110,7 +110,7 @@ <IfModule !mpm_worker_module> <IfModule !mpm_prefork_module> <IfDefine WSGI_MPM_EXISTS_PREFORK_MODULE> -LoadModule mpm_prefork_module '%(modules_directory)s/mod_mpm_prefork.so' +LoadModule mpm_prefork_module '${HTTPD_MODULES_DIRECTORY}/mod_mpm_prefork.so' </IfDefine> </IfModule> </IfModule> @@ -123,13 +123,13 @@ <IfModule !mpm_worker_module> <IfModule !mpm_prefork_module> <IfDefine WSGI_MPM_ENABLE_EVENT_MODULE> -LoadModule mpm_event_module '%(modules_directory)s/mod_mpm_event.so' +LoadModule mpm_event_module '${HTTPD_MODULES_DIRECTORY}/mod_mpm_event.so' </IfDefine> <IfDefine WSGI_MPM_ENABLE_WORKER_MODULE> -LoadModule mpm_worker_module '%(modules_directory)s/mod_mpm_worker.so' +LoadModule mpm_worker_module '${HTTPD_MODULES_DIRECTORY}/mod_mpm_worker.so' </IfDefine> <IfDefine WSGI_MPM_ENABLE_PREFORK_MODULE> -LoadModule mpm_prefork_module '%(modules_directory)s/mod_mpm_prefork.so' +LoadModule mpm_prefork_module '${HTTPD_MODULES_DIRECTORY}/mod_mpm_prefork.so' </IfDefine> </IfModule> </IfModule> @@ -138,66 +138,75 @@ <IfVersion >= 2.4> <IfModule !access_compat_module> -LoadModule access_compat_module '%(modules_directory)s/mod_access_compat.so' +LoadModule access_compat_module '${HTTPD_MODULES_DIRECTORY}/mod_access_compat.so' </IfModule> <IfModule !unixd_module> -LoadModule unixd_module '%(modules_directory)s/mod_unixd.so' +LoadModule unixd_module '${HTTPD_MODULES_DIRECTORY}/mod_unixd.so' </IfModule> <IfModule !authn_core_module> -LoadModule authn_core_module '%(modules_directory)s/mod_authn_core.so' +LoadModule authn_core_module '${HTTPD_MODULES_DIRECTORY}/mod_authn_core.so' </IfModule> <IfModule !authz_core_module> -LoadModule authz_core_module '%(modules_directory)s/mod_authz_core.so' +LoadModule authz_core_module '${HTTPD_MODULES_DIRECTORY}/mod_authz_core.so' </IfModule> </IfVersion> <IfModule !authz_host_module> -LoadModule authz_host_module '%(modules_directory)s/mod_authz_host.so' +LoadModule authz_host_module '${HTTPD_MODULES_DIRECTORY}/mod_authz_host.so' </IfModule> <IfModule !mime_module> -LoadModule mime_module '%(modules_directory)s/mod_mime.so' +LoadModule mime_module '${HTTPD_MODULES_DIRECTORY}/mod_mime.so' </IfModule> <IfModule !rewrite_module> -LoadModule rewrite_module '%(modules_directory)s/mod_rewrite.so' +LoadModule rewrite_module '${HTTPD_MODULES_DIRECTORY}/mod_rewrite.so' </IfModule> <IfModule !alias_module> -LoadModule alias_module '%(modules_directory)s/mod_alias.so' +LoadModule alias_module '${HTTPD_MODULES_DIRECTORY}/mod_alias.so' </IfModule> <IfModule !dir_module> -LoadModule dir_module '%(modules_directory)s/mod_dir.so' +LoadModule dir_module '${HTTPD_MODULES_DIRECTORY}/mod_dir.so' </IfModule> <IfModule !env_module> -LoadModule env_module '%(modules_directory)s/mod_env.so' +LoadModule env_module '${HTTPD_MODULES_DIRECTORY}/mod_env.so' </IfModule> <IfVersion >= 2.2.15> <IfModule !reqtimeout_module> -LoadModule reqtimeout_module '%(modules_directory)s/mod_reqtimeout.so' +LoadModule reqtimeout_module '${HTTPD_MODULES_DIRECTORY}/mod_reqtimeout.so' </IfModule> </IfVersion> <IfDefine WSGI_COMPRESS_RESPONSES> <IfModule !deflate_module> -LoadModule deflate_module '%(modules_directory)s/mod_deflate.so' +LoadModule deflate_module '${HTTPD_MODULES_DIRECTORY}/mod_deflate.so' </IfModule> </IfDefine> <IfDefine WSGI_AUTH_USER> <IfModule !auth_basic_module> -LoadModule auth_basic_module '%(modules_directory)s/mod_auth_basic.so' +LoadModule auth_basic_module '${HTTPD_MODULES_DIRECTORY}/mod_auth_basic.so' </IfModule> <IfModule !auth_digest_module> -LoadModule auth_digest_module '%(modules_directory)s/mod_auth_digest.so' +LoadModule auth_digest_module '${HTTPD_MODULES_DIRECTORY}/mod_auth_digest.so' </IfModule> <IfModule !authz_user_module> -LoadModule authz_user_module '%(modules_directory)s/mod_authz_user.so' +LoadModule authz_user_module '${HTTPD_MODULES_DIRECTORY}/mod_authz_user.so' +</IfModule> +</IfDefine> + +<IfDefine WSGI_WITH_PROXY> +<IfModule !proxy_module> +LoadModule proxy_module ${HTTPD_MODULES_DIRECTORY}/mod_proxy.so +</IfModule> +<IfModule !proxy_http_module> +LoadModule proxy_http_module ${HTTPD_MODULES_DIRECTORY}/mod_proxy_http.so </IfModule> </IfDefine> <IfModule mpm_prefork_module> <IfDefine WSGI_WITH_PHP5> <IfModule !php5_module> -Loadmodule php5_module '%(modules_directory)s/libphp5.so' +Loadmodule php5_module '${HTTPD_MODULES_DIRECTORY}/libphp5.so' </IfModule> AddHandler application/x-httpd-php .php </IfDefine> @@ -207,7 +216,7 @@ <IfDefine WSGI_SERVER_METRICS> <IfModule !status_module> -LoadModule status_module '%(modules_directory)s/mod_status.so' +LoadModule status_module '${HTTPD_MODULES_DIRECTORY}/mod_status.so' </IfModule> </IfDefine> @@ -258,11 +267,12 @@ inactivity-timeout=%(inactivity_timeout)s \\ deadlock-timeout=%(deadlock_timeout)s \\ graceful-timeout=%(graceful_timeout)s \\ + eviction-timeout=%(eviction_timeout)s \\ shutdown-timeout=%(shutdown_timeout)s \\ send-buffer-size=%(send_buffer_size)s \\ receive-buffer-size=%(receive_buffer_size)s \\ header-buffer-size=%(header_buffer_size)s \\ - proxy-buffer-size=%(proxy_buffer_size)s \\ + response-buffer-size=%(response_buffer_size)s \\ server-metrics=%(daemon_server_metrics_flag)s </IfDefine> <IfDefine !WSGI_MULTIPROCESS> @@ -282,10 +292,11 @@ inactivity-timeout=%(inactivity_timeout)s \\ deadlock-timeout=%(deadlock_timeout)s \\ graceful-timeout=%(graceful_timeout)s \\ + eviction-timeout=%(eviction_timeout)s \\ shutdown-timeout=%(shutdown_timeout)s \\ send-buffer-size=%(send_buffer_size)s \\ receive-buffer-size=%(receive_buffer_size)s \\ - proxy-buffer-size=%(proxy_buffer_size)s \\ + response-buffer-size=%(response_buffer_size)s \\ server-metrics=%(daemon_server_metrics_flag)s </IfDefine> </IfDefine> @@ -340,7 +351,7 @@ <IfDefine WSGI_ACCESS_LOG> <IfModule !log_config_module> -LoadModule log_config_module %(modules_directory)s/mod_log_config.so +LoadModule log_config_module ${HTTPD_MODULES_DIRECTORY}/mod_log_config.so </IfModule> LogFormat "%%h %%l %%u %%t \\"%%r\\" %%>s %%b" common LogFormat "%%h %%l %%u %%t \\"%%r\\" %%>s %%b \\"%%{Referer}i\\" \\"%%{User-agent}i\\"" combined @@ -360,7 +371,7 @@ <IfDefine WSGI_WITH_HTTPS> <IfModule !ssl_module> -LoadModule ssl_module %(modules_directory)s/mod_ssl.so +LoadModule ssl_module ${HTTPD_MODULES_DIRECTORY}/mod_ssl.so </IfModule> </IfDefine> @@ -428,6 +439,14 @@ ThreadStackSize 262144 </IfModule> +<IfDefine !WSGI_VIRTUAL_HOST> +<IfVersion < 2.4> +NameVirtualHost *:%(port)s +</IfVersion> +<VirtualHost _default_:%(port)s> +</VirtualHost> +</IfDefine> + <IfDefine WSGI_VIRTUAL_HOST> <IfVersion < 2.4> @@ -604,6 +623,17 @@ </IfDefine> """ +APACHE_PROXY_PASS_CONFIG = """ +ProxyPass '%(mount_point)s' '%(url)s' +""" + +APACHE_PROXY_PASS_HOST_CONFIG = """ +<VirtualHost *:%(port)s> +ServerName %(host)s +ProxyPass / '%(url)s' +</VirtualHost> +""" + APACHE_ALIAS_DIRECTORY_CONFIG = """ Alias '%(mount_point)s' '%(directory)s' @@ -674,10 +704,28 @@ process-group=express application-group=server-metrics """ +APACHE_SERVICE_CONFIG = """ +WSGIDaemonProcess 'service:%(name)s' display-name=%%{GROUP} threads=1 \\ + user='%(user)s' group='%(group)s' +WSGIImportScript '%(script)s' process-group='service:%(name)s' \\ + application-group=%%{GLOBAL} +""" + def generate_apache_config(options): with open(options['httpd_conf'], 'w') as fp: print(APACHE_GENERAL_CONFIG % options, file=fp) + if options['proxy_url_aliases']: + for mount_point, url in options['proxy_url_aliases']: + print(APACHE_PROXY_PASS_CONFIG % dict( + mount_point=mount_point, url=url), file=fp) + + if options['proxy_virtual_hosts']: + for host, url in options['proxy_virtual_hosts']: + print(APACHE_PROXY_PASS_HOST_CONFIG % dict( + host=host, port=options['port'], url=url), + file=fp) + if options['url_aliases']: for mount_point, target in sorted(options['url_aliases'], reverse=True): @@ -722,6 +770,15 @@ print(APACHE_EXTENSION_CONFIG % dict(extension=extension), file=fp) + if options['service_scripts']: + users = dict(options['service_users'] or []) + groups = dict(options['service_groups'] or []) + for name, script in options['service_scripts']: + user = users.get(name, '${WSGI_RUN_USER}') + group = groups.get(name, '${WSGI_RUN_GROUP}') + print(APACHE_SERVICE_CONFIG % dict(name=name, user=user, + group=group, script=script), file=fp) + if options['include_files']: for filename in options['include_files']: filename = os.path.abspath(filename) @@ -1338,6 +1395,9 @@ HTTPD_COMMAND="$HTTPD $HTTPD_ARGS" +HTTPD_MODULES_DIRECTORY="%(modules_directory)s" +export HTTPD_MODULES_DIRECTORY + SHLIBPATH="%(shlibpath)s" if [ "x$SHLIBPATH" != "x" ]; then @@ -1548,10 +1608,16 @@ optparse.make_option('--graceful-timeout', type='int', default=15, metavar='SECONDS', help='Grace period for requests to complete ' - 'normally, without accepting new requests, when worker processes ' - 'are being shutdown and restarted due to maximum requests being ' - 'reached or due to graceful restart signal. Defaults to 15 ' - 'seconds.'), + 'normally, while still accepting new requests, when worker ' + 'processes are being shutdown and restarted due to maximum ' + 'requests being reached. Defaults to 15 seconds.'), + optparse.make_option('--eviction-timeout', type='int', default=0, + metavar='SECONDS', help='Grace period for requests to complete ' + 'normally, while still accepting new requests, when the WSGI ' + 'application is being evicted from the worker processes, and ' + 'the process restarted, due to forced graceful restart signal. ' + 'Defaults to timeout specified by \'--graceful-timeout\' ' + 'option.'), optparse.make_option('--deadlock-timeout', type='int', default=60, metavar='SECONDS', help='Maximum number of seconds allowed ' @@ -1655,7 +1721,7 @@ metavar='NUMBER', help='Size of buffer used for reading ' 'response headers from daemon processes. Defaults to 0, ' 'indicating internal default of 32768 bytes is used.'), - optparse.make_option('--proxy-buffer-size', type='int', default=0, + optparse.make_option('--response-buffer-size', type='int', default=0, metavar='NUMBER', help='Maximum amount of response content ' 'that will be allowed to be buffered in the Apache child ' 'worker process when proxying the response from a daemon ' @@ -1670,12 +1736,12 @@ 'the worker processes will still though be reloaded if the ' 'WSGI script file itself is modified.'), - optparse.make_option('--user', default=default_run_user(), metavar='NAME', - help='When being run by the root user, the user that the WSGI ' - 'application should be run as.'), + optparse.make_option('--user', default=default_run_user(), + metavar='USERNAME', help='When being run by the root user, ' + 'the user that the WSGI application should be run as.'), optparse.make_option('--group', default=default_run_group(), - metavar='NAME', help='When being run by the root user, the group ' - 'that the WSGI application should be run as.'), + metavar='GROUP', help='When being run by the root user, the ' + 'group that the WSGI application should be run as.'), optparse.make_option('--callable-object', default='application', metavar='NAME', help='The name of the entry point for the WSGI ' @@ -1716,6 +1782,15 @@ default=False, help='Flag indicating whether Apache error ' 'documents will override application error responses.'), + optparse.make_option('--proxy-url-alias', action='append', nargs=2, + dest='proxy_url_aliases', metavar='URL-PATH URL', + help='Map a sub URL such that any requests against it will be ' + 'proxied to the specified URL.'), + optparse.make_option('--proxy-virtual-host', action='append', nargs=2, + dest='proxy_virtual_hosts', metavar='HOSTNAME URL', + help='Proxy any requests for the specified host name to the ' + 'remote URL.'), + optparse.make_option('--keep-alive-timeout', type='int', default=0, metavar='SECONDS', help='The number of seconds which a client ' 'connection will be kept alive to allow subsequent requests ' @@ -1837,6 +1912,16 @@ optparse.make_option('--access-log-format', metavar='FORMAT', help='Specify the format of the access log records.'), + optparse.make_option('--error-log-name', metavar='FILE-NAME', + default='error_log', help='Specify the name of the error ' + 'log file when it is being written to the log directory.'), + optparse.make_option('--access-log-name', metavar='FILE-NAME', + default='access_log', help='Specify the name of the access ' + 'log file when it is being written to the log directory.'), + optparse.make_option('--startup-log-name', metavar='FILE-NAME', + default='startup_log', help='Specify the name of the startup ' + 'log file when it is being written to the log directory.'), + optparse.make_option('--rotate-logs', action='store_true', default=False, help='Flag indicating whether log rotation should be performed.'), optparse.make_option('--max-log-size', default=5, type='int', @@ -1909,6 +1994,22 @@ optparse.make_option('--with-php5', action='store_true', default=False, help='Flag indicating whether PHP 5 support should be enabled.'), + optparse.make_option('--service-script', action='append', nargs=2, + dest='service_scripts', metavar='SERVICE SCRIPT-PATH', + help='Specify the name of a Python script to be loaded and ' + 'executed in the context of a distinct daemon process. Used ' + 'for running a managed service.'), + optparse.make_option('--service-user', action='append', nargs=2, + dest='service_users', metavar='SERVICE USERNAME', + help='When being run by the root user, the user that the ' + 'distinct daemon process started to run the managed service ' + 'should be run as.'), + optparse.make_option('--service-group', action='append', nargs=2, + dest='service_groups', metavar='SERVICE GROUP', + help='When being run by the root user, the group that the ' + 'distinct daemon process started to run the managed service ' + 'should be run as.'), + optparse.make_option('--enable-docs', action='store_true', default=False, help='Flag indicating whether the mod_wsgi documentation should ' 'be made available at the /__wsgi__/docs sub URL.'), @@ -2124,7 +2225,7 @@ if not options['log_to_terminal']: options['error_log_file'] = os.path.join(options['log_directory'], - 'error_log') + options['error_log_name']) else: try: with open('/dev/stderr', 'w'): @@ -2137,7 +2238,7 @@ if not options['log_to_terminal']: options['access_log_file'] = os.path.join( - options['log_directory'], 'access_log') + options['log_directory'], options['access_log_name']) else: try: with open('/dev/stdout', 'w'): @@ -2226,6 +2327,14 @@ if options['with_newrelic_platform']: options['server_metrics'] = True + if options['service_scripts']: + service_scripts = [] + for name, script in options['service_scripts']: + if not os.path.isabs(script): + script = os.path.abspath(script) + service_scripts.append((name, script)) + options['service_scripts'] = service_scripts + max_clients = options['processes'] * options['threads'] if options['max_clients'] is not None: @@ -2357,7 +2466,7 @@ if options['startup_log']: if not options['log_to_terminal']: options['startup_log_file'] = os.path.join( - options['log_directory'], 'startup_log') + options['log_directory'], options['startup_log_name']) else: try: with open('/dev/stderr', 'w'): @@ -2491,6 +2600,8 @@ options['httpd_arguments_list'].append('-DWSGI_CHUNKED_REQUEST') if options['with_php5']: options['httpd_arguments_list'].append('-DWSGI_WITH_PHP5') + if options['proxy_url_aliases'] or options['proxy_virtual_hosts']: + options['httpd_arguments_list'].append('-DWSGI_WITH_PROXY') options['httpd_arguments_list'].extend( _mpm_module_defines(options['modules_directory'], @@ -2502,14 +2613,7 @@ options['python_executable'] = sys.executable options['shlibpath_var'] = apxs_config.SHLIBPATH_VAR - - if apxs_config.WITH_PACKAGES: - shlibpath = [] - shlibpath.append(os.path.join(apxs_config.PACKAGES, 'apr-util', 'lib')) - shlibpath.append(os.path.join(apxs_config.PACKAGES, 'apr', 'lib')) - options['shlibpath'] = ':'.join(shlibpath) - else: - options['shlibpath'] = '' + options['shlibpath'] = apxs_config.SHLIBPATH generate_wsgi_handler_script(options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/src/server/mod_wsgi.c new/mod_wsgi-4.4.8/src/server/mod_wsgi.c --- old/mod_wsgi-4.4.6/src/server/mod_wsgi.c 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/src/server/mod_wsgi.c 2015-02-08 10:34:19.000000000 +0100 @@ -85,6 +85,7 @@ static apr_interval_time_t wsgi_idle_timeout = 0; static apr_interval_time_t wsgi_request_timeout = 0; static apr_interval_time_t wsgi_graceful_timeout = 0; +static apr_interval_time_t wsgi_eviction_timeout = 0; static apr_time_t volatile wsgi_deadlock_shutdown_time = 0; static apr_time_t volatile wsgi_idle_shutdown_time = 0; static apr_time_t volatile wsgi_graceful_shutdown_time = 0; @@ -6596,6 +6597,7 @@ int inactivity_timeout = 0; int request_timeout = 0; int graceful_timeout = 0; + int eviction_timeout = 0; int connect_timeout = 15; int socket_timeout = 0; int queue_timeout = 0; @@ -6609,7 +6611,7 @@ int send_buffer_size = 0; int recv_buffer_size = 0; int header_buffer_size = 0; - int proxy_buffer_size = 0; + int response_buffer_size = 0; const char *script_user = NULL; const char *script_group = NULL; @@ -6808,6 +6810,14 @@ if (graceful_timeout < 0) return "Invalid graceful timeout for WSGI daemon process."; } + else if (!strcmp(option, "eviction-timeout")) { + if (!*value) + return "Invalid eviction timeout for WSGI daemon process."; + + eviction_timeout = atoi(value); + if (eviction_timeout < 0) + return "Invalid eviction timeout for WSGI daemon process."; + } else if (!strcmp(option, "connect-timeout")) { if (!*value) return "Invalid connect timeout for WSGI daemon process."; @@ -6873,13 +6883,13 @@ "or 0 for default."; } } - else if (!strcmp(option, "proxy-buffer-size")) { + else if (!strcmp(option, "response-buffer-size")) { if (!*value) - return "Invalid proxy buffer size for WSGI daemon process."; + return "Invalid response buffer size for WSGI daemon process."; - proxy_buffer_size = atoi(value); - if (proxy_buffer_size < 65536 && proxy_buffer_size != 0) { - return "Proxy buffer size must be >= 65536 bytes, " + response_buffer_size = atoi(value); + if (response_buffer_size < 65536 && response_buffer_size != 0) { + return "Response buffer size must be >= 65536 bytes, " "or 0 for default."; } } @@ -7077,6 +7087,7 @@ entry->inactivity_timeout = apr_time_from_sec(inactivity_timeout); entry->request_timeout = apr_time_from_sec(request_timeout); entry->graceful_timeout = apr_time_from_sec(graceful_timeout); + entry->eviction_timeout = apr_time_from_sec(eviction_timeout); entry->connect_timeout = apr_time_from_sec(connect_timeout); entry->socket_timeout = apr_time_from_sec(socket_timeout); entry->queue_timeout = apr_time_from_sec(queue_timeout); @@ -7090,7 +7101,7 @@ entry->send_buffer_size = send_buffer_size; entry->recv_buffer_size = recv_buffer_size; entry->header_buffer_size = header_buffer_size; - entry->proxy_buffer_size = proxy_buffer_size; + entry->response_buffer_size = response_buffer_size; entry->script_user = script_user; entry->script_group = script_group; @@ -8288,6 +8299,9 @@ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, wsgi_server, "mod_wsgi (pid=%d): Graceful timeout is %d.", getpid(), (int)(apr_time_sec(wsgi_graceful_timeout))); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, wsgi_server, + "mod_wsgi (pid=%d): Eviction timeout is %d.", + getpid(), (int)(apr_time_sec(wsgi_eviction_timeout))); } while (1) { @@ -8407,6 +8421,29 @@ } } + if (!restart && wsgi_eviction_timeout) { + if (graceful_time) { + if (graceful_time <= now) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, wsgi_server, + "mod_wsgi (pid=%d): Daemon process " + "graceful timer expired '%s'.", getpid(), + group->name); + + restart = 1; + } + else { + if (!period || ((graceful_time - now) < period)) + period = graceful_time - now; + else if (wsgi_eviction_timeout < period) + period = wsgi_eviction_timeout; + } + } + else { + if (!period || (wsgi_eviction_timeout < period)) + period = wsgi_eviction_timeout; + } + } + if (restart) { wsgi_daemon_shutdown++; kill(getpid(), SIGINT); @@ -8579,6 +8616,7 @@ wsgi_idle_timeout = daemon->group->inactivity_timeout; wsgi_request_timeout = daemon->group->request_timeout; wsgi_graceful_timeout = daemon->group->graceful_timeout; + wsgi_eviction_timeout = daemon->group->eviction_timeout; if (wsgi_deadlock_timeout || wsgi_idle_timeout) { rv = apr_thread_create(&reaper, thread_attr, wsgi_monitor_thread, @@ -8751,17 +8789,20 @@ apr_thread_mutex_lock(wsgi_monitor_lock); wsgi_graceful_shutdown_time = apr_time_now(); - wsgi_graceful_shutdown_time += wsgi_graceful_timeout; + if (wsgi_eviction_timeout) + wsgi_graceful_shutdown_time += wsgi_eviction_timeout; + else + wsgi_graceful_shutdown_time += wsgi_graceful_timeout; apr_thread_mutex_unlock(wsgi_monitor_lock); ap_log_error(APLOG_MARK, APLOG_INFO, 0, wsgi_server, - "mod_wsgi (pid=%d): Graceful shutdown " + "mod_wsgi (pid=%d): Process eviction " "requested, waiting for requests to complete " "'%s'.", getpid(), daemon->group->name); } else { ap_log_error(APLOG_MARK, APLOG_INFO, 0, wsgi_server, - "mod_wsgi (pid=%d): Graceful shutdown " + "mod_wsgi (pid=%d): Process eviction " "requested, triggering immediate shutdown " "'%s'.", getpid(), daemon->group->name); @@ -11202,7 +11243,7 @@ /* Transfer any response content. */ - return wsgi_transfer_response(r, bbin, group->proxy_buffer_size); + return wsgi_transfer_response(r, bbin, group->response_buffer_size); } static apr_status_t wsgi_socket_read(apr_socket_t *sock, void *vbuf, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/src/server/wsgi_daemon.h new/mod_wsgi-4.4.8/src/server/wsgi_daemon.h --- old/mod_wsgi-4.4.6/src/server/wsgi_daemon.h 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/src/server/wsgi_daemon.h 2015-02-08 10:34:19.000000000 +0100 @@ -113,6 +113,7 @@ apr_time_t inactivity_timeout; apr_time_t request_timeout; apr_time_t graceful_timeout; + apr_time_t eviction_timeout; apr_time_t connect_timeout; apr_time_t socket_timeout; apr_time_t queue_timeout; @@ -122,7 +123,7 @@ int send_buffer_size; int recv_buffer_size; int header_buffer_size; - int proxy_buffer_size; + int response_buffer_size; const char *script_user; const char *script_group; int cpu_time_limit; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/src/server/wsgi_version.h new/mod_wsgi-4.4.8/src/server/wsgi_version.h --- old/mod_wsgi-4.4.6/src/server/wsgi_version.h 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/src/server/wsgi_version.h 2015-02-08 10:34:19.000000000 +0100 @@ -25,8 +25,8 @@ #define MOD_WSGI_MAJORVERSION_NUMBER 4 #define MOD_WSGI_MINORVERSION_NUMBER 4 -#define MOD_WSGI_MICROVERSION_NUMBER 6 -#define MOD_WSGI_VERSION_STRING "4.4.6" +#define MOD_WSGI_MICROVERSION_NUMBER 8 +#define MOD_WSGI_VERSION_STRING "4.4.8" /* ------------------------------------------------------------------------- */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mod_wsgi-4.4.6/win32/README.rst new/mod_wsgi-4.4.8/win32/README.rst --- old/mod_wsgi-4.4.6/win32/README.rst 2015-01-15 11:12:31.000000000 +0100 +++ new/mod_wsgi-4.4.8/win32/README.rst 2015-02-08 10:34:19.000000000 +0100 @@ -21,7 +21,7 @@ using. 4. That you are using a mod_wsgi binary built with the same version of -the Microsoft C/++ compiler as the version of Python you are using. +the Microsoft C/C++ compiler as the version of Python you are using. The Microsoft C/C++ compiler versions which were used for various Python versions are: