diff options
author | Peter Stadler <peter.stadler@student.uibk.ac.at> | 2020-11-28 21:30:39 +0100 |
---|---|---|
committer | Peter Stadler <peter.stadler@student.uibk.ac.at> | 2020-12-20 22:00:13 +0100 |
commit | 49e053ac5270b08cfacde81fc03ee68c72c4ad51 (patch) | |
tree | 7ac250350f2873294ce001aa050d2b1d030cd926 /net/etebase/files | |
parent | 20c52fc6516a76b90f516caa5a119860c0b605cc (diff) |
etesync-server: rename to etebase
Signed-off-by: Peter Stadler <peter.stadler@student.uibk.ac.at>
Diffstat (limited to 'net/etebase/files')
-rw-r--r-- | net/etebase/files/81_setup-etebase | 54 | ||||
-rw-r--r-- | net/etebase/files/etebase.locations | 13 | ||||
-rw-r--r-- | net/etebase/files/uci.cfg | 13 | ||||
-rw-r--r-- | net/etebase/files/uwsgi.ini | 48 | ||||
-rw-r--r-- | net/etebase/files/uwsgi.init | 135 |
5 files changed, 263 insertions, 0 deletions
diff --git a/net/etebase/files/81_setup-etebase b/net/etebase/files/81_setup-etebase new file mode 100644 index 000000000..43a4ec789 --- /dev/null +++ b/net/etebase/files/81_setup-etebase @@ -0,0 +1,54 @@ +#!/bin/sh + +cd /usr/share/etebase || exit 1 + +python3 manage.pyc migrate --noinput || exit 1 + +# setup minimal ini for collectstatic: +mkdir -p /var/etc/etebase/ || exit 1 +printf "[global]\nSTATIC_ROOT=/www/etebase/static" >etesync-server.ini || exit 1 +python3 manage.pyc collectstatic --noinput || exit 1 + +ETEBASE_HAS_USER_PY3CMD="import sqlite3 +c = sqlite3.connect('db.sqlite3').cursor() +c.execute('select * from auth_user') +if c.fetchone()==None: print('0') +else: print('1')" + +echo + +if [ "$(python3 -c "$ETEBASE_HAS_USER_PY3CMD" || exit 1)" = "0" ] +then + echo "===== First, create a superuser of the Webinterface by =====" + [ -t 0 ] && python3 manage.pyc createsuperuser || + echo "===== python3 $(pwd)/manage.pyc createsuperuser =====" +fi + +chown -Rh etebase:nogroup . /www/etebase/ || exit 1 + +[ -x /etc/init.d/nginx ] || exit 1 + +/etc/init.d/nginx running && /etc/init.d/nginx reload || /etc/init.d/nginx start + +router_ip() { + local ifstat="$(ifstatus "lan")" + + for ip in $(echo "${ifstat}" | jsonfilter -e '@["ipv4-address"].*.address') + do echo "${ip}" && return + done + + for ip in $(echo "${ifstat}" | jsonfilter -e '@["ipv6-address"].*.address') + do echo "[${ip}]" && return + done + + for ip in $(echo "${ifstat}" | \ + jsonfilter -e '@["ipv6-prefix-assignment"].*["local-address"].address') + do echo "[${ip}]" && return + done + + echo '$ROUTER' +} + +echo "===== You can add users by https://$(router_ip)/etebase/admin/login =====" + +exit 0 diff --git a/net/etebase/files/etebase.locations b/net/etebase/files/etebase.locations new file mode 100644 index 000000000..cb5ea938d --- /dev/null +++ b/net/etebase/files/etebase.locations @@ -0,0 +1,13 @@ +location /etebase/static { + access_log off; + error_log /dev/null; + expires 1y; + try_files $uri $uri/ =404; +} + +location /etebase { + access_log off; + error_log /dev/null; + include uwsgi_params; + uwsgi_pass unix:///var/run/etebase.socket; +} diff --git a/net/etebase/files/uci.cfg b/net/etebase/files/uci.cfg new file mode 100644 index 000000000..66aaf2270 --- /dev/null +++ b/net/etebase/files/uci.cfg @@ -0,0 +1,13 @@ + +config django 'global' + option static_url 'static/' + option debug 'false' + +config django 'allowed_hosts' + list uci_allow_all_ips_of 'loopback' + list uci_allow_all_ips_of 'lan' +# list allowed_host "example.com" + +config django 'database' + option engine 'django.db.backends.sqlite3' + option name 'db.sqlite3' diff --git a/net/etebase/files/uwsgi.ini b/net/etebase/files/uwsgi.ini new file mode 100644 index 000000000..5f0c67d45 --- /dev/null +++ b/net/etebase/files/uwsgi.ini @@ -0,0 +1,48 @@ +; The script /etc/init.d/etebase creates the second symlink in the +; following chain when starting (and deletes it when stopping the service): +; /etc/uwsgi/vassals/etebase.ini (letting the emperor load it on-demand) +; -> /var/etc/etebase/uwsgi.ini (in RAM) +; -> /etc/uwsgi/vassals/etebase.available (this file) + +[uwsgi] +strict = true + +plugin = python +manage-script-name = true +chdir = /usr/share/etebase +mount = /etebase=etesync_server.wsgi:application +pidfile = /var/etc/etebase/master.pid + +enable-threads = true +thunder-lock = true +post-buffering = 8192 +harakiri = 60 +lazy-apps = true +master = true +idle = 600 + +plugin = syslog +; disable-logging only affects req-logger: +disable-logging = true +log-format=%(method) %(uri) => return %(status) (%(rsize) bytes in %(msecs) ms) +req-logger = syslog:etebase_req + +logger = etebase syslog:etebase_main +ignore-sigpipe = true +ignore-write-errors = true + +if-env = UWSGI_EMPEROR_FD +; the regular expression leaves for successful de/activation only one line each: +log-route = etebase ^(?!... Starting uWSGI |compiled with version: |os: Linux|nodename: |machine: |clock source: |pcre jit |detected number of CPU cores: |current working directory: |writing pidfile to |detected binary path: |chdir.. to |your processes number limit is |your memory page size is |detected max file descriptor number: |lock engine: |thunder lock: |uwsgi socket |setgid.. to |setuid.. to |Python version: |Python main interpreter initialized at |python threads support |your server socket listen backlog is limited to |your mercy for graceful operations on workers is |mapped |... Operational MODE: |... uWSGI is running in multiple interpreter mode ...|spawned uWSGI worker |mounting |WSGI app |announcing my loyalty to the Emperor...|workers have been inactive for more than |SIGINT/SIGQUIT received...killing workers...|worker |goodbye to uWSGI.) +end-if = + +if-not-env = UWSGI_EMPEROR_FD +log-route = etebase .* +vacuum = true +socket = /var/run/etebase.socket +end-if = + +chmod-socket = 660 +chown-socket = etebase:nogroup +uid = etebase +gid = nogroup diff --git a/net/etebase/files/uwsgi.init b/net/etebase/files/uwsgi.init new file mode 100644 index 000000000..72dbbefcc --- /dev/null +++ b/net/etebase/files/uwsgi.init @@ -0,0 +1,135 @@ +#!/bin/sh /etc/rc.common + +START=82 + +USE_PROCD=1 + +ETEBASE_INI="/var/etc/etebase/server.ini" + + +etebase_print_uci_allow_all_ips_of() { + local ifstat="$(ifstatus "$1")" + + for ip in $(echo "${ifstat}" | jsonfilter -e '@["ipv4-address"].*.address') + do echo "allowed_host_${ip//[^0-9]/_} = ${ip}" + done + + for ip in $(echo "${ifstat}" | jsonfilter -e '@["ipv6-address"].*.address') + do echo "allowed_host_${ip//[^0-9A-Fa-f]/_} = [${ip}]" + done + + for ip in $(echo "${ifstat}" | \ + jsonfilter -e '@["ipv6-prefix-assignment"].*["local-address"].address') + do echo "allowed_host_${ip//[^0-9A-Fa-f]/_} = [${ip}]" + done +} + + +etebase_validate_global() { + cd /usr/share/etebase/ >/dev/null || return + + uci_load_validate etebase django "global" "$1" \ + 'secret_file:file:secret.txt' \ + 'static_url:string:/etebase/static' \ + 'language_code:string:en-us' \ + 'time_zone:string:UTC' \ + 'debug:bool:false' \ + ; +} + + +etebase_print_global() { + printf "\n[global]\n" + + echo "secret_file = ${secret_file}" + echo "static_root = /www/etebase/static" #sic! + echo "static_url = ${static_url}" + echo "language_code = ${language_code}" + echo "time_zone = ${time_zone}" + echo "debug = ${debug}" +} + + +etebase_validate_allowed_hosts() { + uci_load_validate etebase django "allowed_hosts" "$1" \ + 'uci_allow_all_ips_of:network' \ + 'allowed_host:host' \ + ; +} + + +etebase_print_allowed_hosts() { + printf "\n[allowed_hosts]\n" + + local iface + for iface in ${uci_allow_all_ips_of} + do etebase_print_uci_allow_all_ips_of "${iface}" + done + + local host + for host in ${allowed_host} + do echo "allowed_host_${host//[^0-9A-Za-z]/_} = ${host}" + done +} + + +etebase_validate_database() { + cd /usr/share/etebase/ >/dev/null || return + + uci_load_validate etebase django "database" "$1" \ + 'engine:hostname:django.db.backends.sqlite3' \ + 'name:file:db.sqlite3' \ + ; +} + + +etebase_print_database() { + printf "\n[database]\n" + echo "engine = ${engine}" + echo "name = ${name}" +} + + +etebase_init() { # This must print ONLY configuration lines: + echo "; This file is re-created from /etc/config/etebase " + etebase_validate_global etebase_print_global + etebase_validate_allowed_hosts etebase_print_allowed_hosts + etebase_validate_database etebase_print_database +} >"${ETEBASE_INI}" + + +start_service() { + mkdir -p /var/etc/etebase/ + + etebase_init + + logger -p 'daemon.info' -t 'etebase_init' 'starting ...' + ln -sf /etc/uwsgi/vassals/etebase.available /var/etc/etebase/uwsgi.ini +} + + +stop_service() { + rm -f /var/etc/etebase/uwsgi.ini "${ETEBASE_INI}" +} + + +reload_service() { + etebase_init + + logger -p 'daemon.info' -t 'etebase_init' 'reloading ...' + kill -SIGHUP "$(cat "/var/etc/etebase/master.pid")" 2>/dev/null + #if the server is in on-demand mode, the ini files are reloaded then, too. +} + + +service_triggers() { + procd_open_validate + etebase_validate_global "$@" + etebase_validate_allowed_hosts "$@" + etebase_validate_database "$@" + procd_close_validate + + config_load etebase + config_list_foreach "allowed_hosts" "uci_allow_all_ips_of" procd_add_reload_interface_trigger + procd_add_reload_trigger etebase +} |