James Oakley 2024-11-05 20:02:26 +00:00 committed by Git OBS Bridge
commit f9602c68f3
23 changed files with 3051 additions and 0 deletions

23
.gitattributes vendored Normal file
View File

@ -0,0 +1,23 @@
## Default LFS
*.7z filter=lfs diff=lfs merge=lfs -text
*.bsp filter=lfs diff=lfs merge=lfs -text
*.bz2 filter=lfs diff=lfs merge=lfs -text
*.gem filter=lfs diff=lfs merge=lfs -text
*.gz filter=lfs diff=lfs merge=lfs -text
*.jar filter=lfs diff=lfs merge=lfs -text
*.lz filter=lfs diff=lfs merge=lfs -text
*.lzma filter=lfs diff=lfs merge=lfs -text
*.obscpio filter=lfs diff=lfs merge=lfs -text
*.oxt filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.rpm filter=lfs diff=lfs merge=lfs -text
*.tbz filter=lfs diff=lfs merge=lfs -text
*.tbz2 filter=lfs diff=lfs merge=lfs -text
*.tgz filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.txz filter=lfs diff=lfs merge=lfs -text
*.whl filter=lfs diff=lfs merge=lfs -text
*.xz filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.zst filter=lfs diff=lfs merge=lfs -text

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.osc

42
README.openSUSE Normal file
View File

@ -0,0 +1,42 @@
====================
openSUSE uWSGI Notes
====================
Upgrading from 1.2.6
--------------------
The init script and the sysconfig file /etc/sysconfig/uwsgi are now deprecated
in favor of a systemd service and a default configuration file
/etc/uwsgi/uwsgi.ini.
Emperor Mode
------------
The included uwsgi service runs uWSGI in Emperor mode by default. It will
monitor the /etc/uwsgi/vassals directory for configurations and will
automatically load and restart uWSGI processes when configuration files are
placed there or modified. Some example configurations are provided in the
directory. To enable one, rename it without the .example at the end and edit
for your application.
For more information on Emperor mode, see
https://uwsgi-docs.readthedocs.org/en/latest/Emperor.html
Plugins
-------
This uWSGI package is fully modular. Some plugins, such as the Python plugin,
are not embedded in the main server binary.
This means that your application configurations need to specify the plugins it
uses. For example, a Python application will need the following option
specified:
plugins = python
Alternatively, uWSGI has a autoload option that will load any plugins when it
encounters options for those plugins in the configuration. To enable that, use
the following in the configuration:
autoload = 1

10
django.ini.example Normal file
View File

@ -0,0 +1,10 @@
[uwsgi]
plugin = python
socket = 127.0.0.1:3034
threads = 40
master = 1
autoload = 1
env = DJANGO_SETTINGS_MODULE=myapp.settings
module = django.core.handlers.wsgi:WSGIHandler()
chdir = /srv/djangoapp001

5
opensuse.ini.in Normal file
View File

@ -0,0 +1,5 @@
[uwsgi]
inherit = base
plugin_dir = @@LIBDIR@@/uwsgi
embedded_plugins = null
plugins = @@PLUGINS@@

99
python313.patch Normal file
View File

@ -0,0 +1,99 @@
From 699dc20f8204ee18812951600b0221156d217530 Mon Sep 17 00:00:00 2001
From: Riccardo Magliocchetti <riccardo.magliocchetti@gmail.com>
Date: Sun, 21 Jul 2024 16:32:31 +0200
Subject: [PATCH] plugins/python: handle cframe removal from CPython thread
state
Use current_frame instead
---
plugins/python/python_plugin.c | 16 ++++++++++++++++
plugins/python/uwsgi_python.h | 12 ++++++++++++
2 files changed, 28 insertions(+)
Index: uwsgi-2.0.28/plugins/python/python_plugin.c
===================================================================
--- uwsgi-2.0.28.orig/plugins/python/python_plugin.c
+++ uwsgi-2.0.28/plugins/python/python_plugin.c
@@ -1615,7 +1615,11 @@ void uwsgi_python_suspend(struct wsgi_re
#elif defined UWSGI_PY312
up.current_c_recursion_remaining[wsgi_req->async_id] = tstate->c_recursion_remaining;
up.current_py_recursion_remaining[wsgi_req->async_id] = tstate->py_recursion_remaining;
+#ifdef UWSGI_PY313
+ up.current_frame[wsgi_req->async_id] = tstate->current_frame;
+#else
up.current_frame[wsgi_req->async_id] = tstate->cframe;
+#endif
#elif defined UWSGI_PY311
up.current_recursion_remaining[wsgi_req->async_id] = tstate->recursion_remaining;
up.current_frame[wsgi_req->async_id] = tstate->cframe;
@@ -1632,7 +1636,11 @@ void uwsgi_python_suspend(struct wsgi_re
#elif defined UWSGI_PY312
up.current_main_c_recursion_remaining = tstate->c_recursion_remaining;
up.current_main_py_recursion_remaining = tstate->py_recursion_remaining;
+#ifdef UWSGI_PY313
+ up.current_main_frame = tstate->current_frame;
+#else
up.current_main_frame = tstate->cframe;
+#endif
#elif defined UWSGI_PY311
up.current_main_recursion_remaining = tstate->recursion_remaining;
up.current_main_frame = tstate->cframe;
@@ -1876,7 +1884,11 @@ void uwsgi_python_resume(struct wsgi_req
#elif defined UWSGI_PY312
tstate->c_recursion_remaining = up.current_c_recursion_remaining[wsgi_req->async_id];
tstate->py_recursion_remaining = up.current_py_recursion_remaining[wsgi_req->async_id];
+#ifdef UWSGI_PY313
+ tstate->current_frame = up.current_frame[wsgi_req->async_id];
+#else
tstate->cframe = up.current_frame[wsgi_req->async_id];
+#endif
#elif defined UWSGI_PY311
tstate->recursion_remaining = up.current_recursion_remaining[wsgi_req->async_id];
tstate->cframe = up.current_frame[wsgi_req->async_id];
@@ -1893,7 +1905,11 @@ void uwsgi_python_resume(struct wsgi_req
#elif defined UWSGI_PY312
tstate->c_recursion_remaining = up.current_main_c_recursion_remaining;
tstate->py_recursion_remaining = up.current_main_py_recursion_remaining;
+#ifdef UWSGI_PY313
+ tstate->current_frame = up.current_main_frame;
+#else
tstate->cframe = up.current_main_frame;
+#endif
#elif defined UWSGI_PY311
tstate->recursion_remaining = up.current_main_recursion_remaining;
tstate->cframe = up.current_main_frame;
Index: uwsgi-2.0.28/plugins/python/uwsgi_python.h
===================================================================
--- uwsgi-2.0.28.orig/plugins/python/uwsgi_python.h
+++ uwsgi-2.0.28/plugins/python/uwsgi_python.h
@@ -29,6 +29,10 @@
# define UWSGI_PY313
#endif
+#if (PY_VERSION_HEX >= 0x030d0000)
+# define UWSGI_PY313
+#endif
+
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7
#define HAS_NOT_PyMemoryView_FromBuffer
#endif
@@ -183,11 +187,19 @@ struct uwsgi_python {
#elif defined UWSGI_PY312
int *current_c_recursion_remaining;
int *current_py_recursion_remaining;
+#ifdef UWSGI_PY313
+ struct _PyInterpreterFrame **current_frame;
+#else
_PyCFrame **current_frame;
+#endif
int current_main_c_recursion_remaining;
int current_main_py_recursion_remaining;
+#ifdef UWSGI_PY313
+ struct _PyInterpreterFrame *current_main_frame;
+#else
_PyCFrame *current_main_frame;
+#endif
#elif defined UWSGI_PY311
int *current_recursion_remaining;
_PyCFrame **current_frame;

10
rails.yml.example Normal file
View File

@ -0,0 +1,10 @@
uwsgi:
plugins: rack
rack: config.ru
master: 1
autoload: 1
processes: 8
socket: 127.0.0.1:3033
post-buffering: 4096
chdir: /srv/railsapp001

8
trac.ini.example Normal file
View File

@ -0,0 +1,8 @@
[uwsgi]
master = true
autoload = true
processes = 2
module = trac.web.main:dispatch_request
env = TRAC_ENV=/srv/project001
socket = 127.0.0.1:3032

View File

@ -0,0 +1,9 @@
--- a/plugins/systemd_logger/systemd_logger.c
+++ b/plugins/systemd_logger/systemd_logger.c
@@ -1,5 +1,6 @@
#include "../../uwsgi.h"
+#include <syslog.h>
#include <systemd/sd-journal.h>
ssize_t uwsgi_systemd_logger(struct uwsgi_logger *ul, char *message, size_t len) {

View File

@ -0,0 +1,9 @@
--- a/plugins/objc_gc/uwsgiplugin.py
+++ b/plugins/objc_gc/uwsgiplugin.py
@@ -1,5 +1,5 @@
NAME="objc_gc"
-CFLAGS=["-fobjc-gc"]
+CFLAGS=[]
LDFLAGS=[]
LIBS=[]
GCC_LIST=['objc_gc.m']

View File

@ -0,0 +1,16 @@
Index: uwsgi-2.0.25.1/uwsgiconfig.py
===================================================================
--- uwsgi-2.0.25.1.orig/uwsgiconfig.py
+++ uwsgi-2.0.25.1/uwsgiconfig.py
@@ -1444,10 +1444,7 @@ def build_plugin(path, uc, cflags, ldfla
except:
pass
- if uc:
- plugin_dest = uc.get('plugin_build_dir', uc.get('plugin_dir')) + '/' + name + '_plugin'
- else:
- plugin_dest = name + '_plugin'
+ plugin_dest = name + '_plugin'
shared_flag = '-shared'

View File

@ -0,0 +1,54 @@
--- a/plugins/jvm/uwsgiplugin.py
+++ b/plugins/jvm/uwsgiplugin.py
@@ -69,11 +69,6 @@ if "-framework JavaVM" in JVM_LIBPATH:
GCC_LIST = ['jvm_plugin']
-if 'LD_RUN_PATH' in os.environ:
- os.environ['LD_RUN_PATH'] += ':' + JVM_LIBPATH[0][2:]
-else:
- os.environ['LD_RUN_PATH'] = JVM_LIBPATH[0][2:]
-
def post_build(config):
if subprocess.call("javac %s/plugins/jvm/uwsgi.java" % os.getcwd(), shell=True) != 0:
os._exit(1)
--- a/plugins/php/uwsgiplugin.py
+++ b/plugins/php/uwsgiplugin.py
@@ -19,7 +19,6 @@ LDFLAGS = os.popen(PHPPATH + ' --ldflags
if ld_run_path:
LDFLAGS.append('-L%s' % ld_run_path)
- os.environ['LD_RUN_PATH'] = ld_run_path
# PHP8 and above does not add the version to the library
# name
--- a/plugins/python/uwsgiplugin.py
+++ b/plugins/python/uwsgiplugin.py
@@ -90,8 +90,6 @@ if not 'UWSGI_PYTHON_NOLIB' in os.enviro
LDFLAGS.append("-L%s" % libdir)
LDFLAGS.append("-Wl,-rpath,%s" % libdir)
- os.environ['LD_RUN_PATH'] = "%s" % libdir
-
LIBS.append('-lpython%s' % get_python_version())
else:
LIBS = []
--- a/plugins/rack/uwsgiplugin.py
+++ b/plugins/rack/uwsgiplugin.py
@@ -48,7 +48,6 @@ LIBS = os.popen(RUBYPATH + " -e \"requir
if has_shared == 'yes':
LDFLAGS.append('-L' + libpath )
- os.environ['LD_RUN_PATH'] = libpath
LIBS.append(os.popen(RUBYPATH + " -e \"require 'rbconfig';print '-l' + %s::CONFIG['RUBY_SO_NAME']\"" % rbconfig).read().rstrip())
else:
rubylibdir = os.popen(RUBYPATH + " -e \"require 'rbconfig';print RbConfig::CONFIG['rubylibdir']\"").read().rstrip()
--- a/plugins/ruby19/uwsgiplugin.py
+++ b/plugins/ruby19/uwsgiplugin.py
@@ -42,6 +42,5 @@ LDFLAGS = os.popen(RUBYPATH + " -e \"req
libpath = os.popen(RUBYPATH + " -e \"require 'rbconfig';print %s::CONFIG['libdir']\"" % rbconfig).read().rstrip()
LDFLAGS.append('-L' + libpath )
-os.environ['LD_RUN_PATH'] = libpath
LIBS = os.popen(RUBYPATH + " -e \"require 'rbconfig';print '-l' + %s::CONFIG['RUBY_SO_NAME']\"" % rbconfig).read().rstrip().split()

View File

@ -0,0 +1,16 @@
--- a/plugins/emperor_pg/uwsgiplugin.py
+++ b/plugins/emperor_pg/uwsgiplugin.py
@@ -2,11 +2,8 @@ import os
NAME = 'emperor_pg'
-CFLAGS = ['-I' + os.popen('pg_config --includedir').read().rstrip()]
+CFLAGS = os.popen('pkg-config --cflags libpq').read().rstrip().split()
LDFLAGS = []
-LIBS = [
- '-L' + os.popen('pg_config --libdir').read().rstrip(),
- '-lpq'
-]
+LIBS = os.popen('pkg-config --libs libpq').read().rstrip().split()
GCC_LIST = ['emperor_pg']

3
uwsgi-2.0.25.1.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a1e4a401f71d29e49d4762223412c32a42594c415f9d72d0f759680e5b8f4cf9
size 811635

3
uwsgi-2.0.28.tar.gz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4bb0762c5becb0414352cca664957206df4d6847e9a1c472e87708dc2cdad610
size 815887

23
uwsgi-93d07ec38b31.patch Normal file
View File

@ -0,0 +1,23 @@
From 93d07ec38b319c2fba7c71d3fd0d5acc2882d65a Mon Sep 17 00:00:00 2001
From: Rosen Penev <rosenp@gmail.com>
Date: Tue, 14 May 2024 21:08:14 -0700
Subject: [PATCH] fix 32-bit compilation with GCC14
Wrong pointer type is used.
---
core/regexp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/regexp.c b/core/regexp.c
index 74bb77751..2b59f16fb 100644
--- a/core/regexp.c
+++ b/core/regexp.c
@@ -23,7 +23,7 @@ int uwsgi_regexp_build(char *re, uwsgi_pcre ** pattern) {
#ifdef UWSGI_PCRE2
int errnbr;
- long unsigned int erroff;
+ size_t erroff;
*pattern = pcre2_compile((const unsigned char *) re, PCRE2_ZERO_TERMINATED, 0, &errnbr, &erroff, NULL);
#else

View File

@ -0,0 +1,47 @@
--- a/uwsgiconfig.py
+++ b/uwsgiconfig.py
@@ -535,7 +535,7 @@ def build_uwsgi(uc, print_only=False, gc
gcc_list.append('%s/%s' % (path, cfile))
for bfile in up.get('BINARY_LIST', []):
try:
- binary_link_cmd = "ld -r -b binary -o %s/%s.o %s/%s" % (path, bfile[1], path, bfile[1])
+ binary_link_cmd = "ld -z noexecstack -r -b binary -o %s/%s.o %s/%s" % (path, bfile[1], path, bfile[1])
print(binary_link_cmd)
if subprocess.call(binary_link_cmd, shell=True) != 0:
raise Exception('unable to link binary file')
@@ -1150,7 +1150,7 @@ class uConf(object):
if not self.embed_config:
self.embed_config = self.get('embed_config')
if self.embed_config:
- binary_link_cmd = "ld -r -b binary -o %s.o %s" % (binarize(self.embed_config), self.embed_config)
+ binary_link_cmd = "ld -z noexecstack -r -b binary -o %s.o %s" % (binarize(self.embed_config), self.embed_config)
print(binary_link_cmd)
subprocess.call(binary_link_cmd, shell=True)
self.cflags.append("-DUWSGI_EMBED_CONFIG=_binary_%s_start" % binarize(self.embed_config))
@@ -1169,7 +1169,7 @@ class uConf(object):
for directory, directories, files in os.walk(ef):
for f in files:
fname = "%s/%s" % (directory, f)
- binary_link_cmd = "ld -r -b binary -o %s.o %s" % (binarize(fname), fname)
+ binary_link_cmd = "ld -z noexecstack -r -b binary -o %s.o %s" % (binarize(fname), fname)
print(binary_link_cmd)
subprocess.call(binary_link_cmd, shell=True)
if symbase:
@@ -1179,7 +1179,7 @@ class uConf(object):
subprocess.call(objcopy_cmd, shell=True)
binary_list.append(binarize(fname))
else:
- binary_link_cmd = "ld -r -b binary -o %s.o %s" % (binarize(ef), ef)
+ binary_link_cmd = "ld -z noexecstack -r -b binary -o %s.o %s" % (binarize(ef), ef)
print(binary_link_cmd)
subprocess.call(binary_link_cmd, shell=True)
binary_list.append(binarize(ef))
@@ -1464,7 +1464,7 @@ def build_plugin(path, uc, cflags, ldfla
gcc_list.append(path + '/' + cfile)
for bfile in up.get('BINARY_LIST', []):
try:
- binary_link_cmd = "ld -r -b binary -o %s/%s.o %s/%s" % (path, bfile[1], path, bfile[1])
+ binary_link_cmd = "ld -z noexecstack -r -b binary -o %s/%s.o %s/%s" % (path, bfile[1], path, bfile[1])
print(binary_link_cmd)
if subprocess.call(binary_link_cmd, shell=True) != 0:
raise Exception('unable to link binary file')

1835
uwsgi.changes Normal file

File diff suppressed because it is too large Load Diff

3
uwsgi.ini Normal file
View File

@ -0,0 +1,3 @@
[uwsgi]
# Directory containing application configs
emperor = /etc/uwsgi/vassals

14
uwsgi.service Normal file
View File

@ -0,0 +1,14 @@
[Unit]
Description=Application Container Server for Networked/Clustered Web Applications
Documentation=https://uwsgi-docs.readthedocs.io/en/latest/
[Service]
ExecStart=/usr/sbin/uwsgi --autoload --ini /etc/uwsgi/uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
KillSignal=SIGINT
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target

812
uwsgi.spec Normal file
View File

@ -0,0 +1,812 @@
#
# spec file for package uwsgi
#
# Copyright (c) 2024 SUSE LLC
#
# 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 https://bugs.opensuse.org/
#
%{?sle15_python_module_pythons}
%define with_php 1
%if 0%{?suse_version} > 1320
%if 0%{?suse_version} >= 1550 || 0%{?sle_version} >= 150400
%define php php8
%else
%define php php7
%endif
%else
%define with_php 0
%endif
Name: uwsgi
Version: 2.0.28
Release: 0
Summary: Application Container Server for Networked/Clustered Web Applications
License: Apache-2.0 AND GPL-2.0-only WITH GCC-exception-2.0
Group: Productivity/Networking/Web/Servers
URL: https://uwsgi-docs.readthedocs.io/en/latest/
Source: https://github.com/unbit/uwsgi/archive/refs/tags/%{version}.tar.gz#/uwsgi-%{version}.tar.gz
Source1: opensuse.ini.in
Source2: uwsgi.service
Source3: django.ini.example
Source4: rails.yml.example
Source5: trac.ini.example
Source6: werkzeug.xml.example
Source7: README.openSUSE
Source8: uwsgi.ini
Source9: uwsgi.tmpfiles.d
# PATCH-FIX-OPENSUSE uwsgi-1.9.17-plugin_build_path.patch - Don't attempt to install plugins to target dest during build
Patch0: uwsgi-1.9.17-plugin_build_path.patch
# PATCH-FIX-OPENSUSE uwsgi-1.9.17-no-LD_RUN_PATH.patch - Disable invalid rpath in plugins
Patch1: uwsgi-2.0.12-no-LD_RUN_PATH.patch
# PATCH-FIX-OPENSUSE uwsgi-1.9.13-objc_gc-no-fobjc-gc.patch - No -fobjc-gc in CFLAGS, which is incorrect in GNU
Patch2: uwsgi-1.9.13-objc_gc-no-fobjc-gc.patch
# PATCH-FIX-OPENSUSE uwsgi-1.9.11-systemd_logger-old_systemd.patch - Older systemd in 12.2 does not implicity include syslog.h
Patch3: uwsgi-1.9.11-systemd_logger-old_systemd.patch
# PATCH-FIX-OPENSUSE uwsgi-2.0.18-postgresql-config.patch - Use pkg-config instead of pg_config
Patch4: uwsgi-2.0.18-postgresql-config.patch
# PATCH-FIX-UPSTREAM uwsgi-ld-noexecstack.patch - Do not create executable stack
Patch5: uwsgi-ld-noexecstack.patch
# PATCH-FIX-UPSTREAM python313.patch - plugins/python: handle cframe removal from CPython thread state https://github.com/unbit/uwsgi/commit/699dc20f8204ee18812951600b0221156d217530
Patch6: python313.patch
BuildRequires: apache-rpm-macros
%if 0%{suse_version} < 1500
BuildRequires: apache2-devel
%else
BuildRequires: apache2-devel >= 2.4.33
%endif
%if 0%{?suse_version} >= 1500
BuildRequires: argon2-devel
%endif
BuildRequires: gcc-c++
BuildRequires: gcc-objc
%if 0%{?suse_version} > 1220
BuildRequires: glusterfs-devel
%endif
#BuildRequires: go
BuildRequires: java-devel
#BuildRequires: krb5-devel
BuildRequires: libattr-devel
BuildRequires: libcap-devel
BuildRequires: libcurl-devel
BuildRequires: libffi-devel
%if 0%{?suse_version} > 1210
BuildRequires: libjansson-devel
%endif
#BuildRequires: libmono-2_0-devel
BuildRequires: libuuid-devel
BuildRequires: libxml2-devel
BuildRequires: libxslt-devel
BuildRequires: libyaml-devel
%if 0%{?suse_version} > 1210
BuildRequires: lua51-devel
%else
BuildRequires: lua-devel
%endif
#BuildRequires: mono-web
BuildRequires: ncurses-devel
BuildRequires: openldap2-devel
BuildRequires: openssl-devel
BuildRequires: pam-devel
BuildRequires: pcre-devel
%if %{with_php}
BuildRequires: %{php}-devel
BuildRequires: %{php}-embed
%endif
BuildRequires: %{python_module devel}
BuildRequires: %{python_module greenlet-devel}
BuildRequires: pkg-config
BuildRequires: postgresql-devel
BuildRequires: python-rpm-macros
%if 0%{?suse_version} <= 1310
BuildRequires: ruby19-devel
%endif
BuildRequires: sqlite3-devel
BuildRequires: tcpd-devel
BuildRequires: pkgconfig(libsystemd)
%ifarch %{ix86} x86_64 %{arm}
%if 0%{?suse_version} < 1310
BuildRequires: v8-devel
%endif
%endif
BuildRequires: zeromq-devel
BuildRequires: pkgconfig(zlib)
%{?systemd_requires}
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Provides: uwsgi-carbon = %{version}
Obsoletes: uwsgi-carbon < 1.9.11
Provides: uwsgi-cgi = %{version}
Obsoletes: uwsgi-cgi < 1.9.11
Provides: uwsgi-fastrouter = %{version}
Obsoletes: uwsgi-fastrouter < 1.9.11
Provides: uwsgi-graylog2 = %{version}
Obsoletes: uwsgi-graylog2 < 1.9.11
Provides: uwsgi-http = %{version}
Obsoletes: uwsgi-http < 1.9.11
Provides: uwsgi-logsocket = %{version}
Obsoletes: uwsgi-logsocket < 1.9.11
Provides: uwsgi-nagios = %{version}
Obsoletes: uwsgi-nagios < 1.9.11
Provides: uwsgi-probepg = %{version}
Obsoletes: uwsgi-probepg < 1.9.11
Provides: uwsgi-redislog = %{version}
Obsoletes: uwsgi-redislog < 1.9.11
Provides: uwsgi-rrdtool = %{version}
Obsoletes: uwsgi-rrdtool < 1.9.11
Provides: uwsgi-rsyslog = %{version}
Obsoletes: uwsgi-rsyslog < 1.9.11
Provides: uwsgi-syslog = %{version}
Obsoletes: uwsgi-syslog < 1.9.11
Provides: uwsgi-ugreen = %{version}
Obsoletes: uwsgi-ugreen < 1.9.11
Provides: uwsgi-zergpool = %{version}
Obsoletes: uwsgi-zergpool < 1.9.11
%if 0%{?suse_version} >= 1550 || 0%{?sle_version} >= 150500
# these must be the last directives before the description
%define python_subpackage_only 1
%python_subpackages
%endif
%description
uWSGI is a self-healing application container server coded in pure C.
It is a WSGI server with a stack for networked/clustered web applications,
implementing message/object passing, caching, RPC and process management.
It uses the uwsgi protocol for all the networking/interprocess communications,
but it can speak other protocols as well (http, fastcgi, mongrel2...)
It can be run in preforking mode, threaded, asynchronous/evented and supports
various forms of green threads/coroutines (such as uGreen, Greenlet, Stackless,
Gevent and Fiber).
Different plugins can be used in order to add compatibility with
different technology on top of the same core.
# This is part of the apache2 package now
%if 0%{suse_version} < 1500
%package -n apache2-mod_proxy_uwsgi
Summary: uWSGI Proxy Module for Apache 2.0
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description -n apache2-mod_proxy_uwsgi
uWSGI is a self-healing application container server coded in pure C.
This package contains an Apache 2.0 proxy module for uWSGI.
%endif
%package -n apache2-mod_uwsgi
Summary: uWSGI Module for Apache 2.0
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description -n apache2-mod_uwsgi
uWSGI is a self-healing application container server coded in pure C.
This package contains an Apache 2.0 module for uWSGI.
%package emperor_pg
Summary: PostgreSQL Emperor Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description emperor_pg
uWSGI is a self-healing application container server coded in pure C.
This package contains an emperor plugin allowing for configuration of
applications (vassals) in a PostgreSQL database.
%package emperor_zeromq
Summary: ZeroMQ Emperor Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description emperor_zeromq
uWSGI is a self-healing application container server coded in pure C.
This package contains an emperor plugin allowing for configuration of
applications (vassals) via ZeroMQ.
%package gevent
Summary: Gevent Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Requires: %{name}-python3 = %{version}
%description gevent
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Python Gevent, which is a non-blocking
networking framework.
%if 0%{?suse_version} > 1220
%package glusterfs
Summary: GlusterFS Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description glusterfs
uWSGI is a self-healing application container server coded in pure C.
This package contains support for returning objects directly from a GlusterFS
filesystem
%endif
%package greenlet
Summary: Greenlet Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Requires: %{name}-python3 = %{version}
%description greenlet
uWSGI is a self-healing application container server coded in pure C.
This package contains support for the Python Greenlet non-blocking network
framework.
%package jvm
Summary: JVM Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Provides: uwsgi-jwsgi = %{version}
Obsoletes: uwsgi-jwsgi < 1.9.11
%description jvm
uWSGI is a self-healing application container server coded in pure C.
This package contains support for embedding a Java virtual machine in uWSGI.
%package ldap
Summary: LDAP Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description ldap
uWSGI is a self-healing application container server coded in pure C.
This package contains support for configuring uWSGI via LDAP.
%package libffi
Summary: Plugin libffi for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description libffi
uWSGI is a self-healing application container server coded in pure C.
This package contains support for libffi.
%package logzmq
Summary: ZMQ Logger for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description logzmq
uWSGI is a self-healing application container server coded in pure C.
This package contains support for ZMQ logging.
%package lua
Summary: Lua Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description lua
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Lua applications via the wsapi interface.
%package pam
Summary: PAM Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description pam
uWSGI is a self-healing application container server coded in pure C.
This package contains support for PAM authentication.
%package psgi
Summary: PSGI Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%{?libperl_requires}
%description psgi
uWSGI is a self-healing application container server coded in pure C.
This package contains the PSGI plugin for running Perl applications that
support the PSGI protocol.
%package pypy
Summary: PyPy Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description pypy
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Python applications using PyPy.
%if 0%{?sle_version} && 0%{?sle_version} <= 150400
%package python3
Summary: Python 3 Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Requires: python3-base >= 3.6
Provides: python3-uwsgi-python3 = %{version}-%{release}
%description python3
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Python 3 applications via the WSGI protocol.
%else
%package -n python-uwsgi-python3
Summary: Python %{python_version} Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%if "%{python_provides}" == "python3"
Provides: uwsgi-python3 = %{version}-%{release}
Obsoletes: uwsgi-python3 < %{version}-%{release}
%endif
# the plugin is linked to the python library, no reason the state -base explicitly
%description -n python-uwsgi-python3
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Python %{python_version} applications via the WSGI protocol.
%endif
%if 0%{?suse_version} <= 1310
%package ruby
Summary: Ruby Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Requires: ruby19
Provides: uwsgi-fiber = %{version}
Obsoletes: uwsgi-fiber < 1.9.11
%description ruby
uWSGI is a self-healing application container server coded in pure C.
This package contains support for Ruby applications.
%endif
%package sqlite3
Summary: SQLite3 Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description sqlite3
uWSGI is a self-healing application container server coded in pure C.
This package contains support for storing application configuration in SQLite3
databases.
%package v8
Summary: V8 JavaScript Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description v8
uWSGI is a self-healing application container server coded in pure C.
This package contains support for JavaScript using V8.
%package xslt
Summary: XSLT Plugin for uWSGI
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
%description xslt
uWSGI is a self-healing application container server coded in pure C.
This package contains support for rendering XML content using XSLT.
%if %{with_php}
%package %{php}
%if 0%{?suse_version} >= 1550
Summary: PHP8 Plugin for uWSGI
%else
Summary: PHP7 Plugin for uWSGI
%endif
Group: Productivity/Networking/Web/Servers
Requires: %{name} = %{version}
Requires: %{php}-embed
%description %{php}
uWSGI is a self-healing application container server coded in pure C.
%if 0%{?suse_version} >= 1550
This package contains support for PHP version 8.
%else
This package contains support for PHP version 7.
%endif
%endif
%prep
%autosetup -p1 -n uwsgi-%{version}
# Generate a config that builds all plugins except for examples and stuff we
# can't satisfy the requirements for or are just broken
excluded_plugins=""
# Still no mongodb in Factory
excluded_plugins="$excluded_plugins stats_pusher_mongodb emperor_mongodb mongodb mongodblog gridfs"
# Mono plugin builds private key during build. It would not be a good idea to
# distribute the same key to multiple systems
excluded_plugins="$excluded_plugins mono"
# Only for OSX
excluded_plugins="$excluded_plugins alarm_speech"
%if 0%{?suse_version} <= 1320
# No php[57]-embed on openSUSE Leap for some reason
excluded_plugins="$excluded_plugins php"
%endif
# No stackless in openSUSE
excluded_plugins="$excluded_plugins stackless"
# No perl-Coro in Factory (there is a broken unmaintained one under d:l:perl:CPAN-C)
excluded_plugins="$excluded_plugins coroae"
# Requires libgloox, which is not in Factory
excluded_plugins="$excluded_plugins alarm_xmpp"
# No gccgo in openSUSE yet
excluded_plugins="$excluded_plugins gccgo"
# This plugin require a libuwsgi, which appears to conflict with core...
excluded_plugins="$excluded_plugins pyuwsgi"
# The SPNEGO router is not complete
excluded_plugins="$excluded_plugins router_spnego"
# These are example plugins and shouldn't be distributed
excluded_plugins="$excluded_plugins cplusplus dummy example"
# Ceph/RADOS not yet in Factory
excluded_plugins="$excluded_plugins rados"
# libtcc not yet in Factory
excluded_plugins="$excluded_plugins libtcc"
# matheval is deprecated
excluded_plugins="$excluded_plugins matheval"
# bsc#1156199 - python-txtorcon: GeoIP support is discontinued
excluded_plugins="$excluded_plugins geoip"
# V8 is not yet available on all platforms and is broken in the v8 versions in
# 13.1+
%if 0%{?suse_version} >= 1310
excluded_plugins="$excluded_plugins v8"
%else
%ifnarch %{ix86} x86_64 %{arm}
excluded_plugins="$excluded_plugins v8"
%endif
%endif
# python3 modules are built separately
excluded_plugins="$excluded_plugins python"
# Ruby 1.9 is no longer available after 13.1
%if 0%{?suse_version} > 1310
excluded_plugins="$excluded_plugins fiber mongrel2 rack rbthreads ruby19"
%endif
%if 0%{?suse_version} <= 1220
# Requirements missing on openSUSE <= 12.2
excluded_plugins="$excluded_plugins glusterfs"
%endif
plugins=$(python3 -c "import sys, os; print(', '.join([p for p in sorted(os.listdir('plugins')) if p not in sys.argv[1:]]))" $excluded_plugins)
sed -e "s#@@LIBDIR@@#%{_libdir}#" -e "s#@@PLUGINS@@#$plugins#" %{SOURCE1} > buildconf/opensuse.ini
# README.openSUSE
cp %{SOURCE7} .
%build
# Find correct location for libjvm
export UWSGICONFIG_JVM_LIBPATH=$(dirname $(find %{_jvmdir}/java/jre/lib -name "libjvm.so" | grep server))
export UWSGICONFIG_JVM_INCPATH="%{_jvmdir}/java/include"
export UWSGICONFIG_LUALIB="lua"
export UWSGICONFIG_LUAPC="lua"
export UWSGICONFIG_RUBYPATH="ruby1.9"
export CFLAGS="%{optflags} -Wno-error=deprecated-declarations -I%{_includedir}/glusterfs -I$(echo %{_libdir}/erlang/lib/erl_interface-*/include) -I%{_jvmdir}/java/include/linux -L$UWSGICONFIG_JVM_LIBPATH/jli"
%{?jobs:export CPUCOUNT=%jobs}
%python_expand PYTHON=$python $python uwsgiconfig.py --build opensuse
# Build python3 plugins
%if 0%{?sle_version} && 0%{?sle_version} <= 150400
python3 uwsgiconfig.py --plugin plugins/python opensuse python3
%else
# https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#bonus-multiple-python-versions-for-the-same-uwsgi-binary
%python_expand PYTHON=$python $python uwsgiconfig.py --plugin plugins/python opensuse ${python_flavor}
%endif
# Build Apache modules
%if 0%{suse_version} < 1500
%{apache_apxs} -c apache2/mod_proxy_uwsgi.c
%endif
%{apache_apxs} -c apache2/mod_uwsgi.c
# Build php plugin
%if %{with_php}
python3 uwsgiconfig.py --plugin plugins/php opensuse %{php}
%endif
%install
install -D -m 0755 uwsgi %{buildroot}%{_sbindir}/uwsgi
install -d -m 0755 %{buildroot}%{_libdir}/uwsgi
install -m 0755 *_plugin.so %{buildroot}%{_libdir}/uwsgi
install -D -m 0644 %{SOURCE2} %{buildroot}%{_unitdir}/uwsgi.service
install -d -m 0755 %{buildroot}%{_sysconfdir}/uwsgi/vassals
install -D -m 0644 %{SOURCE8} %{buildroot}%{_sysconfdir}/uwsgi/uwsgi.ini
install -m 0644 %{SOURCE3} %{SOURCE4} %{SOURCE5} %{SOURCE6} %{buildroot}%{_sysconfdir}/uwsgi/vassals
install -m 0644 vassals/broodlord.ini %{buildroot}%{_sysconfdir}/uwsgi/vassals/broodlord.ini.example
install -m 0644 vassals/cc.ini %{buildroot}%{_sysconfdir}/uwsgi/vassals/cc.ini.example
install -m 0644 vassals/multi.xml %{buildroot}%{_sysconfdir}/uwsgi/vassals/multi.xml.example
%if 0%{?sle_version} && 0%{?sle_version} <= 150400
install -D -m 0644 uwsgidecorators.py %{buildroot}%{python3_sitelib}/uwsgidecorators.py
%else
%{python_expand #
install -D -m 0644 uwsgidecorators.py %{buildroot}%{$python_sitelib}/uwsgidecorators.py
if [ "%{$python_provides}" == "python3" ]; then
ln -s ${python_flavor}_plugin.so %{buildroot}%{_libdir}/uwsgi/python3_plugin.so
fi
}
%endif
install -D plugins/jvm/uwsgi.jar %{buildroot}%{_javadir}/uwsgi.jar
install -d -m 0755 %{buildroot}/%{apache_libexecdir}
install -m 0755 apache2/.libs/*.so %{buildroot}/%{apache_libexecdir}
%if 0%{?suse_version} > 1220
ln -sf /usr/sbin/service %{buildroot}%{_sbindir}/rcuwsgi
%endif
install -d -m 0755 %{buildroot}%{_tmpfilesdir}
install -m 0644 %{SOURCE9} %{buildroot}/%{_tmpfilesdir}/uwsgi.conf
%pre
%service_add_pre uwsgi.service
%post
%service_add_post uwsgi.service
%tmpfiles_create %{_tmpfilesdir}/uwsgi.conf
%preun
%service_del_preun uwsgi.service
%postun
%service_del_postun uwsgi.service
%files
%defattr(-,root,root,-)
%license LICENSE
%doc CONTRIBUTORS README contrib examples README.openSUSE
%{_sbindir}/uwsgi
%dir %{_sysconfdir}/uwsgi/
%config(noreplace) %{_sysconfdir}/uwsgi/uwsgi.ini
%dir %{_sysconfdir}/uwsgi/vassals
%config %{_sysconfdir}/uwsgi/vassals/*
%dir %{_libdir}/uwsgi
%ghost %dir %attr(711,root,root) /run/uwsgi
%{_unitdir}/uwsgi.service
%{_tmpfilesdir}/uwsgi.conf
%if 0%{?suse_version} > 1220
%{_sbindir}/rcuwsgi
%endif
%{_libdir}/uwsgi/airbrake_plugin.so
%{_libdir}/uwsgi/alarm_curl_plugin.so
%{_libdir}/uwsgi/asyncio_plugin.so
%{_libdir}/uwsgi/cache_plugin.so
%{_libdir}/uwsgi/carbon_plugin.so
%{_libdir}/uwsgi/cgi_plugin.so
%{_libdir}/uwsgi/cheaper_backlog2_plugin.so
%{_libdir}/uwsgi/cheaper_busyness_plugin.so
%{_libdir}/uwsgi/clock_monotonic_plugin.so
%{_libdir}/uwsgi/clock_realtime_plugin.so
%{_libdir}/uwsgi/corerouter_plugin.so
%{_libdir}/uwsgi/curl_cron_plugin.so
%{_libdir}/uwsgi/dumbloop_plugin.so
%{_libdir}/uwsgi/emperor_amqp_plugin.so
%{_libdir}/uwsgi/exception_log_plugin.so
%{_libdir}/uwsgi/fastrouter_plugin.so
%{_libdir}/uwsgi/forkptyrouter_plugin.so
%{_libdir}/uwsgi/echo_plugin.so
%{_libdir}/uwsgi/graylog2_plugin.so
%{_libdir}/uwsgi/http_plugin.so
%{_libdir}/uwsgi/legion_cache_fetch_plugin.so
%{_libdir}/uwsgi/logcrypto_plugin.so
%{_libdir}/uwsgi/logfile_plugin.so
%{_libdir}/uwsgi/logpipe_plugin.so
%{_libdir}/uwsgi/logsocket_plugin.so
%{_libdir}/uwsgi/nagios_plugin.so
%{_libdir}/uwsgi/objc_gc_plugin.so
%{_libdir}/uwsgi/msgpack_plugin.so
%{_libdir}/uwsgi/notfound_plugin.so
%{_libdir}/uwsgi/ping_plugin.so
%{_libdir}/uwsgi/pty_plugin.so
%{_libdir}/uwsgi/rawrouter_plugin.so
%{_libdir}/uwsgi/redislog_plugin.so
%{_libdir}/uwsgi/router_access_plugin.so
%{_libdir}/uwsgi/router_basicauth_plugin.so
%{_libdir}/uwsgi/router_cache_plugin.so
%{_libdir}/uwsgi/router_expires_plugin.so
%{_libdir}/uwsgi/router_hash_plugin.so
%{_libdir}/uwsgi/router_http_plugin.so
%{_libdir}/uwsgi/router_memcached_plugin.so
%{_libdir}/uwsgi/router_metrics_plugin.so
%{_libdir}/uwsgi/router_radius_plugin.so
%{_libdir}/uwsgi/router_redirect_plugin.so
%{_libdir}/uwsgi/router_redis_plugin.so
%{_libdir}/uwsgi/router_rewrite_plugin.so
%{_libdir}/uwsgi/router_static_plugin.so
%{_libdir}/uwsgi/router_uwsgi_plugin.so
%{_libdir}/uwsgi/router_xmldir_plugin.so
%{_libdir}/uwsgi/rpc_plugin.so
%{_libdir}/uwsgi/rrdtool_plugin.so
%{_libdir}/uwsgi/rsyslog_plugin.so
%{_libdir}/uwsgi/signal_plugin.so
%{_libdir}/uwsgi/spooler_plugin.so
%{_libdir}/uwsgi/ssi_plugin.so
%{_libdir}/uwsgi/sslrouter_plugin.so
%{_libdir}/uwsgi/stats_pusher_file_plugin.so
%{_libdir}/uwsgi/stats_pusher_socket_plugin.so
%{_libdir}/uwsgi/stats_pusher_statsd_plugin.so
%{_libdir}/uwsgi/symcall_plugin.so
%{_libdir}/uwsgi/syslog_plugin.so
%{_libdir}/uwsgi/systemd_logger_plugin.so
%{_libdir}/uwsgi/tornado_plugin.so
%{_libdir}/uwsgi/transformation_chunked_plugin.so
%{_libdir}/uwsgi/transformation_gzip_plugin.so
%{_libdir}/uwsgi/transformation_offload_plugin.so
%{_libdir}/uwsgi/transformation_template_plugin.so
%{_libdir}/uwsgi/transformation_tofile_plugin.so
%{_libdir}/uwsgi/transformation_toupper_plugin.so
%{_libdir}/uwsgi/tuntap_plugin.so
%{_libdir}/uwsgi/ugreen_plugin.so
%{_libdir}/uwsgi/webdav_plugin.so
%{_libdir}/uwsgi/xattr_plugin.so
%{_libdir}/uwsgi/zabbix_plugin.so
%{_libdir}/uwsgi/zergpool_plugin.so
%if 0%{suse_version} < 1500
%files -n apache2-mod_proxy_uwsgi
%defattr(-,root,root,-)
%{apache_libexecdir}/mod_proxy_uwsgi.so
%endif
%files -n apache2-mod_uwsgi
%defattr(-,root,root,-)
%{apache_libexecdir}/mod_uwsgi.so
%files emperor_pg
%defattr(-,root,root,-)
%{_libdir}/uwsgi/emperor_pg_plugin.so
%files emperor_zeromq
%defattr(-,root,root,-)
%{_libdir}/uwsgi/emperor_zeromq_plugin.so
%files gevent
%defattr(-,root,root,-)
%{_libdir}/uwsgi/gevent_plugin.so
%files greenlet
%defattr(-,root,root,-)
%{_libdir}/uwsgi/greenlet_plugin.so
%if 0%{?suse_version} > 1220
%files glusterfs
%defattr(-,root,root,-)
%{_libdir}/uwsgi/glusterfs_plugin.so
%endif
%files jvm
%defattr(-,root,root,-)
%{_libdir}/uwsgi/jvm_plugin.so
%{_libdir}/uwsgi/jwsgi_plugin.so
%{_libdir}/uwsgi/ring_plugin.so
%{_libdir}/uwsgi/servlet_plugin.so
%{_javadir}/uwsgi.jar
%files ldap
%defattr(-,root,root,-)
%{_libdir}/uwsgi/ldap_plugin.so
%files libffi
%defattr(-,root,root,-)
%{_libdir}/uwsgi/libffi_plugin.so
%files logzmq
%defattr(-,root,root,-)
%{_libdir}/uwsgi/logzmq_plugin.so
%files lua
%defattr(-,root,root,-)
%{_libdir}/uwsgi/lua_plugin.so
%files pam
%defattr(-,root,root,-)
%{_libdir}/uwsgi/pam_plugin.so
%files psgi
%defattr(-,root,root,-)
%{_libdir}/uwsgi/psgi_plugin.so
%files pypy
%defattr(-,root,root,-)
%{_libdir}/uwsgi/pypy_plugin.so
%if 0%{?sle_version} && 0%{?sle_version} <= 150400
%files python3
%defattr(-,root,root,-)
%{_libdir}/uwsgi/python3_plugin.so
%{python3_sitelib}/uwsgidecorators.py*
%else
%files %{python_files uwsgi-python3}
%defattr(-,root,root,-)
%{_libdir}/uwsgi/%{python_flavor}_plugin.so
%if "%{python_provides}" == "python3"
%{_libdir}/uwsgi/python3_plugin.so
%endif
%{python_sitelib}/uwsgidecorators.py*
%endif
%if 0%{?suse_version} <= 1310
%files ruby
%defattr(-,root,root,-)
%{_libdir}/uwsgi/fiber_plugin.so
%{_libdir}/uwsgi/mongrel2_plugin.so
%{_libdir}/uwsgi/rack_plugin.so
%{_libdir}/uwsgi/rbthreads_plugin.so
%{_libdir}/uwsgi/ruby19_plugin.so
%endif
%files sqlite3
%defattr(-,root,root,-)
%{_libdir}/uwsgi/sqlite3_plugin.so
%ifarch %{ix86} x86_64 %{arm}
%if 0%{?suse_version} < 1310
%files v8
%defattr(-,root,root,-)
%{_libdir}/uwsgi/v8_plugin.so
%endif
%endif
%files xslt
%defattr(-,root,root,-)
%{_libdir}/uwsgi/xslt_plugin.so
%if 0%{?suse_version} > 1320
%files %{php}
%defattr(-,root,root,-)
%{_libdir}/uwsgi/php*_plugin.so
%endif
%changelog

2
uwsgi.tmpfiles.d Normal file
View File

@ -0,0 +1,2 @@
# Type Path Mode UID GID Age Argument
d /run/uwsgi 0711 root root - -

7
werkzeug.xml.example Normal file
View File

@ -0,0 +1,7 @@
<uwsgi>
<module>werkzeug.testapp:test_app</module>
<master/>
<processes>4</processes>
<socket>127.0.0.1:3031</socket>
</uwsgi>