Index: main/waeup.aaue/trunk/Dockerfile
===================================================================
--- main/waeup.aaue/trunk/Dockerfile	(revision 17338)
+++ main/waeup.aaue/trunk/Dockerfile	(revision 17338)
@@ -0,0 +1,70 @@
+FROM ubuntu:22.04
+ARG KOFA_VERSION=1.8.2.dev0
+
+MAINTAINER Uli Fouquet <uli@waeup.org>
+
+ARG DEBIAN_FRONTEND=noninteractive
+RUN apt-get update && apt-get install -y tzdata
+RUN apt-get install -y apt-utils build-essential
+RUN apt-get install -y python2.7-dev libxml2-dev libxslt1-dev \
+                       zlib1g-dev python3-virtualenv
+# see https://urllib3.readthedocs.org/en/latest/security.html#openssl-pyopenssl
+RUN apt-get install -y libssl-dev libffi-dev
+# libs needed/useful for Pillow image manipulations
+RUN apt-get install -y libjpeg-dev libfreetype6-dev libtiff-dev libopenjp2-7-dev
+# helpers not strictly necessary for running kofa but for setup and development
+RUN apt-get install -y sudo git wget pwgen xmlstarlet
+
+# add user `kofa`
+RUN useradd -ms /bin/bash kofa
+# set password of user `kofa` and add to group 'sudo'
+RUN echo kofa:kofa | chpasswd && adduser kofa sudo
+
+USER kofa
+ENV HOME /home/kofa
+WORKDIR /home/kofa
+
+# create a virtual env
+RUN virtualenv -p /usr/bin/python2.7 py27
+
+# get sources
+
+## We work with local kofa sources (create source packages with `python setup.py sdist`)
+COPY --chown=kofa:kofa dist/waeup.kofa-${KOFA_VERSION}.tar.gz /home/kofa
+COPY --chown=kofa:kofa dist/kofacustom.nigeria-1.3.dev0.tar.gz /home/kofa
+COPY --chown=kofa:kofa dist/waeup.aaue-1.2.dev0.tar.gz /home/kofa
+
+RUN tar -xzf waeup.aaue-1.2.dev0.tar.gz
+RUN rm waeup.aaue-1.2.dev0.tar.gz
+RUN mv waeup.aaue-1.2.dev0 waeup.aaue
+
+RUN mkdir waeup.aaue/sources
+
+RUN tar -xzf kofacustom.nigeria-1.3.dev0.tar.gz
+RUN rm kofacustom.nigeria-1.3.dev0.tar.gz
+RUN mv kofacustom.nigeria-1.3.dev0 waeup.aaue/sources/kofacustom.nigeria
+
+RUN tar -xzf waeup.kofa-${KOFA_VERSION}.tar.gz
+RUN rm waeup.kofa-${KOFA_VERSION}.tar.gz
+RUN mv waeup.kofa-${KOFA_VERSION} waeup.aaue/sources/waeup.kofa
+
+## make sure, all added files belong to `kofa`
+#RUN chown -R kofa:kofa /home/kofa/
+
+# install kofa -- this is the heavy part...
+WORKDIR /home/kofa/waeup.aaue
+
+# set random secrets for cookies
+RUN xmlstarlet edit -L -P -S -N x="http://namespaces.zope.org/browser" --update "//x:beakerSession/@secret" --value `pwgen -s -1 20` etc/site.zcml.in
+RUN xmlstarlet edit -L -P -S -N x="http://namespaces.zope.org/browser" --update "//x:beakerSession/@validate_key" --value "val_"`pwgen -s -1 16` etc/site.zcml.in
+
+# upgrade/pin down build helpers and run the build process
+RUN /home/kofa/py27/bin/pip install --upgrade pip zc.buildout
+RUN /home/kofa/py27/bin/pip install --upgrade --force-reinstall setuptools==44.1.1
+
+RUN /home/kofa/py27/bin/buildout -c buildout-docker.cfg
+
+# this dir will contain data you might want to be persistent
+VOLUME ["/home/kofa/waeup.aaue/var/"]
+
+CMD /home/kofa/waeup.aaue/bin/kofactl fg
Index: main/waeup.aaue/trunk/MANIFEST.in
===================================================================
--- main/waeup.aaue/trunk/MANIFEST.in	(revision 17338)
+++ main/waeup.aaue/trunk/MANIFEST.in	(revision 17338)
@@ -0,0 +1,10 @@
+# see:
+# https://docs.python.org/2/distutils/sourcedist.html#the-manifest-in-template
+graft src
+graft docs
+prune docs/build
+recursive-include etc *.in *.txt
+graft layout
+include *.cfg CHANGES.txt LICENSE Dockerfile
+exclude .* uuid.txt
+global-exclude *~ *.pyc *.pyo
Index: main/waeup.aaue/trunk/buildout-docker.cfg
===================================================================
--- main/waeup.aaue/trunk/buildout-docker.cfg	(revision 17338)
+++ main/waeup.aaue/trunk/buildout-docker.cfg	(revision 17338)
@@ -0,0 +1,201 @@
+[buildout]
+# See http://pypi.python.org/pypi/mr.developer for details
+extensions = mr.developer
+auto-checkout =
+# We cannot use 'src' (the default) as the checked out projects won't
+# work properly with paster (paster looks up any upper directory
+# egg-info dirs and then complains about not-available packages).
+sources-dir = sources
+develop = .
+parts =
+    app
+    i18n
+    test
+    mkdirs
+    zpasswd
+    zope_conf
+    site_zcml
+    zdaemon_conf
+    raw_deploy_ini
+    raw_debug_ini
+    themed_deploy_ini
+    themed_debug_ini
+    profile_ini
+    coverage-detect
+    coverage-report
+# kofactl creation must be _after_ app!
+    kofactl
+    lxml
+    diazo
+# For backward compatibility, telling buildout not to throw away
+# the data and log subdirectories from the parts directory.
+    data
+    log
+# newest = false
+
+extends = versions.cfg
+show-picked-versions = true
+update-versions-file = versions.cfg
+
+index = https://pypi.python.org/simple/
+
+# eggs will be installed in the default buildout location
+# (see .buildout/default.cfg in your home directory)
+# unless you specify an eggs-directory option here.
+
+[sources]
+# None, currently.
+
+[kofa_params]
+## Basic parameters for deployment.
+# default is 127.0.0.1
+host = 0.0.0.0
+# default is 8080
+base_port = 7021
+zeo1_port = 7021
+zeo2_port = 7022
+# zeo3_port = 7023
+server_port = 7020
+# default 7. Number of pre-opened ZODB threads/client
+pool_size = 7
+# default 20MB. Cache size of each client (ZEO only)
+client_cache = 20MB
+# default 5000. Number of objects cached.
+object_cache = 5000
+# number of preopened paster threads, default 10
+threadpool_workers = 10
+devel_pkg = waeup.aaue
+
+[app]
+# This creates all scripts in bin/. The kofactl created here is 'faulty'.
+recipe = zc.recipe.egg
+eggs = waeup.aaue [beaker, diazo]
+       z3c.evalexception>=2.0
+       Paste
+       PasteScript
+       PasteDeploy
+       repoze.profile
+       ZODB3
+interpreter = python-console
+
+[kofactl]
+# See http://pypi.python.org/pypi/zc.recipe.egg for details...
+# Here we create the kofactl script again, this time with a
+# fixed path to zdaemon.conf as argument.
+recipe = zc.recipe.egg
+eggs = waeup.aaue [beaker, diazo]
+arguments = "${buildout:parts-directory}/etc/zdaemon.conf"
+scripts = kofactl=kofactl
+
+[mkdirs]
+recipe = z3c.recipe.mkdir
+paths =
+    ${zope_conf:filestorage}
+    ${zope_conf:logfiles}
+    ${zope_conf:blobstorage}
+    ${buildout:directory}/var/datacenter/media
+    ${buildout:directory}/parts/test/datacenter
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = waeup.aaue [beaker, test]
+defaults = ['--tests-pattern', '^f?tests$', '-v']
+
+# This section named so that the i18n scripts are called bin/i18n...
+[i18n]
+recipe = z3c.recipe.i18n:i18n
+packages = waeup.aaue
+eggs = waeup.aaue
+domain = waeup.aaue
+output = src/waeup/aaue/locales
+zcml =
+
+# This section is named so that the zpasswd utility is
+# called `zpasswd`
+[zpasswd]
+recipe = z3c.recipe.dev:script
+eggs = waeup.aaue
+module = zope.app.server.zpasswd
+method = main
+
+[zope_conf]
+recipe = collective.recipe.template
+input = etc/zope.conf.in
+output = ${buildout:parts-directory}/etc/zope.conf
+filestorage = ${buildout:directory}/var/filestorage
+blobstorage = ${buildout:directory}/var/blobstorage
+logfiles = ${buildout:directory}/var/log
+extra =
+# extra = <grokwarnings>True</grokwarnings>
+# 'extra' is copied verbatim. Use it for product config sections and so.
+
+# The [data] and [log] parts are still in here to instruct buildout to not
+# unintentionally throw away the parts/data and parts/log subdirectories
+# that contain the Data.fs and the log files. These files should be
+# copied to the new locations. See the upgrade notes for more information.
+[data]
+recipe = zc.recipe.filestorage
+
+[log]
+recipe = zc.recipe.filestorage
+
+[site_zcml]
+recipe = collective.recipe.template
+input = etc/site.zcml.in
+output = ${buildout:parts-directory}/etc/site.zcml
+
+[zdaemon_conf]
+recipe = collective.recipe.template
+input = etc/zdaemon.conf.in
+output = ${buildout:parts-directory}/etc/zdaemon.conf
+
+[raw_debug_ini]
+recipe = collective.recipe.template
+input = etc/raw/debug.ini.in
+output = ${buildout:parts-directory}/etc/raw-debug.ini
+
+[raw_deploy_ini]
+recipe = collective.recipe.template
+input = etc/raw/deploy.ini.in
+output = ${buildout:parts-directory}/etc/raw-deploy.ini
+
+[themed_debug_ini]
+recipe = collective.recipe.template
+input = etc/themed/debug.ini.in
+output = ${buildout:parts-directory}/etc/themed-debug.ini
+
+[themed_deploy_ini]
+recipe = collective.recipe.template
+input = etc/themed/deploy.ini.in
+output = ${buildout:parts-directory}/etc/themed-deploy.ini
+
+[profile_ini]
+recipe = collective.recipe.template
+input = etc/profile.ini.in
+output = ${buildout:parts-directory}/etc/profile.ini
+
+# Collect test coverage data.
+[coverage-detect]
+recipe = zc.recipe.testrunner
+eggs = waeup.aaue[beaker]
+defaults = ['--tests-pattern', '^f?tests$', '-v', '--coverage', 'coverage']
+
+# Create a coverage report.
+# Make sure to run bin/coverage-detect to collect the data for the report
+# first!
+[coverage-report]
+recipe = zc.recipe.egg
+eggs = z3c.coverage
+scripts = coveragereport
+arguments = ('${buildout:parts-directory}/coverage-detect/working-directory/coverage', '${buildout:directory}/coverage-report')
+
+[lxml]
+recipe = z3c.recipe.staticlxml
+egg = lxml
+
+[diazo]
+recipe = zc.recipe.egg
+eggs =
+    diazo [wsgi]
+    PasteScript
+    waeup.aaue [beaker, diazo]
Index: main/waeup.aaue/trunk/setup.py
===================================================================
--- main/waeup.aaue/trunk/setup.py	(revision 17337)
+++ main/waeup.aaue/trunk/setup.py	(revision 17338)
@@ -85,5 +85,5 @@
       [console_scripts]
       kofa-debug = grokcore.startup:interactive_debug_prompt
-      kofactl = grokcore.startup:zdaemon_controller
+      kofactl = waeup.kofa.startup:zdaemon_controller
       [paste.app_factory]
       main = waeup.kofa.startup:env_app_factory
