Make Sahana Setup module compatible with Alpine containers, closes #311
This commit is contained in:
parent
04c9795586
commit
b1ff00e36b
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.0.1-200426",
|
||||
"version": "1.0.3-200504",
|
||||
"meta": {
|
||||
"title": "Sahana Eden - SAFIRE",
|
||||
"desc-cs": "Řízení humanítární činnosti - Řešení nouzových událostí",
|
||||
@ -8,7 +8,7 @@
|
||||
},
|
||||
"containers": {
|
||||
"safire": {
|
||||
"image": "sahana_0.0.1-200426",
|
||||
"image": "sahana_1.0.3-200504",
|
||||
"depends": [
|
||||
"safire-postgres"
|
||||
],
|
||||
|
@ -5,7 +5,7 @@ set -ev
|
||||
POSTGRES_DATA="${VOLUMES_DIR}/safire/postgres_data"
|
||||
SAHANA_DATA="${VOLUMES_DIR}/safire/sahana_data"
|
||||
SAHANA_CONF="${VOLUMES_DIR}/safire/sahana_conf"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_0.0.1-200426"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_1.0.3-200504"
|
||||
|
||||
# Create Postgres instance
|
||||
install -o 105432 -g 105432 -m 700 -d ${POSTGRES_DATA}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.0.1-200426",
|
||||
"version": "1.0.3-200504",
|
||||
"meta": {
|
||||
"title": "Sahana Eden - Demo",
|
||||
"desc-cs": "Řízení humanítární činnosti - Demo instance",
|
||||
@ -8,7 +8,7 @@
|
||||
},
|
||||
"containers": {
|
||||
"sahana-demo": {
|
||||
"image": "sahana_0.0.1-200426",
|
||||
"image": "sahana_1.0.3-200504",
|
||||
"depends": [
|
||||
"sahana-demo-postgres"
|
||||
],
|
||||
|
@ -5,7 +5,7 @@ set -ev
|
||||
POSTGRES_DATA="${VOLUMES_DIR}/sahana-demo/postgres_data"
|
||||
SAHANA_DATA="${VOLUMES_DIR}/sahana-demo/sahana_data"
|
||||
SAHANA_CONF="${VOLUMES_DIR}/sahana-demo/sahana_conf"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_0.0.1-200426"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_1.0.3-200504"
|
||||
|
||||
# Create Postgres instance
|
||||
install -o 105432 -g 105432 -m 700 -d ${POSTGRES_DATA}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.0.1-200426",
|
||||
"version": "1.0.3-200504",
|
||||
"meta": {
|
||||
"title": "Sahana Eden",
|
||||
"desc-cs": "Řízení humanítární činnosti",
|
||||
@ -8,7 +8,7 @@
|
||||
},
|
||||
"containers": {
|
||||
"sahana": {
|
||||
"image": "sahana_0.0.1-200426",
|
||||
"image": "sahana_1.0.3-200504",
|
||||
"depends": [
|
||||
"sahana-postgres"
|
||||
],
|
||||
|
@ -1,9 +1,9 @@
|
||||
IMAGE sahana_0.0.1-200426
|
||||
IMAGE sahana_1.0.3-200504
|
||||
FROM alpine3.11-python3.8_3.8.2-200403
|
||||
|
||||
RUN EOF
|
||||
# Install runtime dependencies
|
||||
apk --no-cache add geos nginx py3-dateutil py3-gdal py3-lxml py3-numpy py3-pillow py3-psycopg2 py3-requests py3-sgmllib3k uwsgi-python3
|
||||
apk --no-cache add ansible at geos nginx py3-dateutil py3-gdal py3-lxml py3-numpy py3-pillow py3-psycopg2 py3-requests py3-sgmllib3k py3-yaml uwsgi-python3 sudo
|
||||
|
||||
# Install build dependencies
|
||||
apk --no-cache add --virtual .deps build-base freetype-dev git py3-numpy-dev py3-pip python3-dev ttf-dejavu
|
||||
@ -17,18 +17,19 @@ RUN EOF
|
||||
ln -s handlers/wsgihandler.py /srv/web2py/wsgihandler.py
|
||||
|
||||
# Install Sahana
|
||||
git clone --depth 1 https://github.com/sahana/eden.git /srv/web2py/applications/eden
|
||||
git clone --recursive --depth 1 https://github.com/sahana/eden.git /srv/web2py/applications/eden
|
||||
|
||||
# Install python dependencies, exclude old or unnecessary ones
|
||||
sed -i 's/^Pillow/#Pillow/' /srv/web2py/applications/eden/optional_requirements.txt # We have 6.2.1, Sahana requires 6.2.2
|
||||
sed -i 's/^ansible/#ansible/' /srv/web2py/applications/eden/optional_requirements.txt # Needed for setup
|
||||
sed -i 's/^boto/#boto/' /srv/web2py/applications/eden/optional_requirements.txt # Needed for setup on AWS
|
||||
sed -i 's/^PyRTF/#PyRTF/' /srv/web2py/applications/eden/optional_requirements.txt # Ceased to exist
|
||||
sed -i 's/^PyYAML/#PyYAML/' /srv/web2py/applications/eden/optional_requirements.txt # Needed for setup
|
||||
sed -i 's/^openst/#openst/' /srv/web2py/applications/eden/optional_requirements.txt # Needed for setup on OpenStack
|
||||
pip3 install -r /srv/web2py/applications/eden/optional_requirements.txt
|
||||
pip3 install translate-toolkit
|
||||
|
||||
# Hackfix paths for ansible and other modules with hardcoded paths
|
||||
ln -s /srv/web2py /home/prod
|
||||
|
||||
# Copy fonts with Czech glyphs
|
||||
cp /usr/share/fonts/ttf-dejavu/DejaVuSerif-Bold.ttf /srv/web2py/applications/eden/static/fonts/Helvetica-Bold.ttf
|
||||
cp /usr/share/fonts/ttf-dejavu/DejaVuSerif.ttf /srv/web2py/applications/eden/static/fonts/Helvetica.ttf
|
||||
@ -44,13 +45,14 @@ RUN EOF
|
||||
|
||||
# Patch web2py for python 3.8
|
||||
cd /srv/web2py
|
||||
patch -p0 </tmp/compat.patch
|
||||
patch -p0 </srv/web2py/applications/eden/private/eden_deploy/roles/common/files/_compat.patch
|
||||
cd /srv/web2py/gluon
|
||||
patch -p0 </srv/web2py/applications/eden/private/eden_deploy/roles/common/files/scheduler.diff
|
||||
|
||||
# Cleanup
|
||||
apk --no-cache del .deps
|
||||
find /srv/web2py -name '.git*' -exec rm -rf {} +
|
||||
rm -r /root/.cache
|
||||
rm /tmp/compat.patch
|
||||
EOF
|
||||
|
||||
CMD /bin/s6-svscan /etc/services.d
|
||||
|
@ -1,4 +1,5 @@
|
||||
#!/bin/execlineb -P
|
||||
|
||||
foreground { s6-svwait -d -t 3000 atd }
|
||||
foreground { s6-svwait -d -t 3000 nginx }
|
||||
foreground { s6-svwait -d -t 3000 uwsgi }
|
||||
|
3
lxc-apps/sahana/image.d/etc/services.d/atd/run
Executable file
3
lxc-apps/sahana/image.d/etc/services.d/atd/run
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/execlineb -P
|
||||
|
||||
atd -f
|
1
lxc-apps/sahana/image.d/etc/sudoers.d/sahana
Normal file
1
lxc-apps/sahana/image.d/etc/sudoers.d/sahana
Normal file
@ -0,0 +1 @@
|
||||
sahana ALL=(ALL) NOPASSWD:ALL
|
@ -1,156 +0,0 @@
|
||||
--- gluon/compileapp.py
|
||||
+++ gluon/compileapp.py
|
||||
@@ -61,7 +61,7 @@
|
||||
TEST_CODE = \
|
||||
r"""
|
||||
def _TEST():
|
||||
- import doctest, sys, cStringIO, types, cgi, gluon.fileutils
|
||||
+ import doctest, sys, cStringIO, types, gluon.fileutils
|
||||
if not gluon.fileutils.check_credentials(request):
|
||||
raise HTTP(401, web2py_error='invalid credentials')
|
||||
stdout = sys.stdout
|
||||
--- gluon/globals.py
|
||||
+++ gluon/globals.py
|
||||
@@ -241,7 +241,15 @@
|
||||
# parse POST variables on POST, PUT, BOTH only in post_vars
|
||||
if body and not is_json and env.request_method in ('POST', 'PUT', 'DELETE', 'BOTH'):
|
||||
query_string = env.pop('QUERY_STRING', None)
|
||||
- dpost = cgi.FieldStorage(fp=body, environ=env, keep_blank_values=1)
|
||||
+ content_disposition = env.get('HTTP_CONTENT_DISPOSITION')
|
||||
+ if content_disposition:
|
||||
+ headers = {'content-disposition': content_disposition,
|
||||
+ 'content-type': env['CONTENT_TYPE'],
|
||||
+ 'content-length': env['CONTENT_LENGTH'],
|
||||
+ }
|
||||
+ else:
|
||||
+ headers = None
|
||||
+ dpost = cgi.FieldStorage(fp=body, environ=env, headers=headers, keep_blank_values=1)
|
||||
try:
|
||||
post_vars.update(dpost)
|
||||
except:
|
||||
--- gluon/languages.py
|
||||
+++ gluon/languages.py
|
||||
@@ -16,7 +16,6 @@
|
||||
import sys
|
||||
import pkgutil
|
||||
import logging
|
||||
-from cgi import escape
|
||||
from threading import RLock
|
||||
|
||||
from pydal._compat import copyreg, PY2, maketrans, iterkeys, unicodeT, to_unicode, to_bytes, iteritems, to_native, pjoin
|
||||
--- gluon/packages/dal/pydal/_compat.py
|
||||
+++ gluon/packages/dal/pydal/_compat.py
|
||||
@@ -32,7 +32,6 @@
|
||||
from urllib2 import urlopen
|
||||
from string import maketrans
|
||||
from types import ClassType
|
||||
- import cgi
|
||||
import cookielib
|
||||
from xmlrpclib import ProtocolError
|
||||
BytesIO = StringIO
|
||||
--- gluon/packages/dal/pydal/adapters/oracle.py
|
||||
+++ gluon/packages/dal/pydal/adapters/oracle.py
|
||||
@@ -96,7 +96,7 @@
|
||||
return self.dialect.quote(tablename)
|
||||
|
||||
def _build_value_for_insert(self, field, value, r_values):
|
||||
- if field.type is 'text':
|
||||
+ if field.type == 'text':
|
||||
r_values[':' + field._rname] = self.expand(value, field.type)
|
||||
return ':' + field._rname
|
||||
return self.expand(value, field.type)
|
||||
--- gluon/packages/dal/pydal/contrib/portalocker.py
|
||||
+++ gluon/packages/dal/pydal/contrib/portalocker.py
|
||||
@@ -193,6 +193,9 @@
|
||||
def read(self, size=None):
|
||||
return self.file.read() if size is None else self.file.read(size)
|
||||
|
||||
+ def readinto(self, b):
|
||||
+ b[:] = self.file.read()
|
||||
+
|
||||
def readline(self):
|
||||
return self.file.readline()
|
||||
|
||||
--- gluon/packages/dal/pydal/dialects/postgre.py
|
||||
+++ gluon/packages/dal/pydal/dialects/postgre.py
|
||||
@@ -130,8 +130,8 @@
|
||||
return rv
|
||||
|
||||
def st_asgeojson(self, first, second, query_env={}):
|
||||
- return 'ST_AsGeoJSON(%s,%s,%s,%s)' % (
|
||||
- second['version'], self.expand(first, query_env=query_env),
|
||||
+ return 'ST_AsGeoJSON(%s,%s,%s)' % (
|
||||
+ self.expand(first, query_env=query_env),
|
||||
second['precision'], second['options'])
|
||||
|
||||
def st_astext(self, first, query_env={}):
|
||||
@@ -258,8 +258,8 @@
|
||||
return 'ST_AsText(%s)' % self.expand(first, query_env=query_env)
|
||||
|
||||
def st_asgeojson(self, first, second, query_env={}):
|
||||
- return 'ST_AsGeoJSON(%s,%s,%s,%s)' % (
|
||||
- second['version'], self.expand(first, query_env=query_env),
|
||||
+ return 'ST_AsGeoJSON(%s,%s,%s)' % (
|
||||
+ self.expand(first, query_env=query_env),
|
||||
second['precision'], second['options'])
|
||||
|
||||
def json_key(self, first, key, query_env=None):
|
||||
--- gluon/packages/dal/pydal/helpers/classes.py
|
||||
+++ gluon/packages/dal/pydal/helpers/classes.py
|
||||
@@ -532,6 +532,9 @@
|
||||
self.p += len(data)
|
||||
return data
|
||||
|
||||
+ def readinto(self, bytes):
|
||||
+ return self.read(bytes)
|
||||
+
|
||||
def readline(self):
|
||||
i = self.data.find('\n', self.p)+1
|
||||
if i > 0:
|
||||
--- gluon/packages/dal/pydal/validators.py
|
||||
+++ gluon/packages/dal/pydal/validators.py
|
||||
@@ -148,7 +148,7 @@
|
||||
|
||||
|
||||
def validator_caller(func, value):
|
||||
- if getattr(func, 'validate', None) is Validator.validate:
|
||||
+ if getattr(func, 'validate', None) is not Validator.validate:
|
||||
return func.validate(value)
|
||||
value, error = func(value)
|
||||
if error is not None:
|
||||
@@ -3154,7 +3154,7 @@
|
||||
if not all_special.count(True) >= self.special:
|
||||
failures.append(self.translator("Must include at least %s of the following: %s")
|
||||
% (self.special, self.specials))
|
||||
- elif self.special is 0:
|
||||
+ elif self.special == 0 and self.special is not False:
|
||||
if len(all_special) > 0:
|
||||
failures.append(self.translator("May not contain any of the following: %s")
|
||||
% self.specials)
|
||||
@@ -3169,7 +3169,7 @@
|
||||
if not len(all_upper) >= self.upper:
|
||||
failures.append(self.translator("Must include at least %s uppercase")
|
||||
% str(self.upper))
|
||||
- elif self.upper is 0:
|
||||
+ elif self.upper == 0 and self.upper is not False:
|
||||
if len(all_upper) > 0:
|
||||
failures.append(
|
||||
self.translator("May not include any uppercase letters"))
|
||||
@@ -3179,7 +3179,7 @@
|
||||
if not len(all_lower) >= self.lower:
|
||||
failures.append(self.translator("Must include at least %s lowercase")
|
||||
% str(self.lower))
|
||||
- elif self.lower is 0:
|
||||
+ elif self.lower == 0 and self.lower is not False:
|
||||
if len(all_lower) > 0:
|
||||
failures.append(
|
||||
self.translator("May not include any lowercase letters"))
|
||||
@@ -3192,7 +3192,7 @@
|
||||
if not len(all_number) >= self.number:
|
||||
failures.append(self.translator("Must include at least %s %s")
|
||||
% (str(self.number), numbers))
|
||||
- elif self.number is 0:
|
||||
+ elif self.number == 0 and self.number is not False:
|
||||
if len(all_number) > 0:
|
||||
failures.append(self.translator("May not include any numbers"))
|
||||
if len(failures) == 0:
|
13
lxc-apps/sahana/image.d/usr/local/bin/migrate
Executable file
13
lxc-apps/sahana/image.d/usr/local/bin/migrate
Executable file
@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This is a compatible rewrite of https://github.com/sahana/eden_deploy/blob/master/roles/common/files/migrate specific for Alpine s6-based container
|
||||
|
||||
# Migrate database
|
||||
cd /srv/web2py
|
||||
sed -i 's/settings.base.migrate = False/settings.base.migrate = True/g' applications/eden/models/000_config.py
|
||||
rm -rf applications/eden/compiled
|
||||
sudo -u sahana -- ./web2py.py -S eden -M -R applications/eden/static/scripts/tools/noop.py
|
||||
sed -i 's/settings.base.migrate = True/settings.base.migrate = False/g' applications/eden/models/000_config.py
|
||||
|
||||
# Restart uwsgi
|
||||
s6-svc -t /etc/services.d/uwsgi
|
@ -5,7 +5,7 @@ set -ev
|
||||
POSTGRES_DATA="${VOLUMES_DIR}/sahana/postgres_data"
|
||||
SAHANA_DATA="${VOLUMES_DIR}/sahana/sahana_data"
|
||||
SAHANA_CONF="${VOLUMES_DIR}/sahana/sahana_conf"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_0.0.1-200426"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_1.0.3-200504"
|
||||
|
||||
# Create Postgres instance
|
||||
install -o 105432 -g 105432 -m 700 -d ${POSTGRES_DATA}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.0.1-200426",
|
||||
"version": "1.0.3-200504",
|
||||
"meta": {
|
||||
"title": "Sahana Eden - SAMBRO",
|
||||
"desc-cs": "Řízení humanítární činnosti - Centrum hlášení a výstrah",
|
||||
@ -8,7 +8,7 @@
|
||||
},
|
||||
"containers": {
|
||||
"sambro": {
|
||||
"image": "sahana_0.0.1-200426",
|
||||
"image": "sahana_1.0.3-200504",
|
||||
"depends": [
|
||||
"sambro-postgres"
|
||||
],
|
||||
|
@ -5,7 +5,7 @@ set -ev
|
||||
POSTGRES_DATA="${VOLUMES_DIR}/sambro/postgres_data"
|
||||
SAHANA_DATA="${VOLUMES_DIR}/sambro/sahana_data"
|
||||
SAHANA_CONF="${VOLUMES_DIR}/sambro/sahana_conf"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_0.0.1-200426"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_1.0.3-200504"
|
||||
|
||||
# Create Postgres instance
|
||||
install -o 105432 -g 105432 -m 700 -d ${POSTGRES_DATA}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "0.0.1-200426",
|
||||
"version": "1.0.3-200504",
|
||||
"meta": {
|
||||
"title": "Sahana Eden - SHARE",
|
||||
"desc-cs": "Řízení humanítární činnosti - Úleva a rehabilitace",
|
||||
@ -8,7 +8,7 @@
|
||||
},
|
||||
"containers": {
|
||||
"share": {
|
||||
"image": "sahana_0.0.1-200426",
|
||||
"image": "sahana_1.0.3-200504",
|
||||
"depends": [
|
||||
"share-postgres"
|
||||
],
|
||||
|
@ -5,7 +5,7 @@ set -ev
|
||||
POSTGRES_DATA="${VOLUMES_DIR}/share/postgres_data"
|
||||
SAHANA_DATA="${VOLUMES_DIR}/share/sahana_data"
|
||||
SAHANA_CONF="${VOLUMES_DIR}/share/sahana_conf"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_0.0.1-200426"
|
||||
SAHANA_LAYER="${LAYERS_DIR}/sahana_1.0.3-200504"
|
||||
|
||||
# Create Postgres instance
|
||||
install -o 105432 -g 105432 -m 700 -d ${POSTGRES_DATA}
|
||||
|
Loading…
Reference in New Issue
Block a user