aboutsummaryrefslogtreecommitdiff
path: root/net/etebase/files
diff options
context:
space:
mode:
authorPeter Stadler <peter.stadler@student.uibk.ac.at>2020-11-28 21:30:39 +0100
committerPeter Stadler <peter.stadler@student.uibk.ac.at>2020-12-20 22:00:13 +0100
commit49e053ac5270b08cfacde81fc03ee68c72c4ad51 (patch)
tree7ac250350f2873294ce001aa050d2b1d030cd926 /net/etebase/files
parent20c52fc6516a76b90f516caa5a119860c0b605cc (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-etebase54
-rw-r--r--net/etebase/files/etebase.locations13
-rw-r--r--net/etebase/files/uci.cfg13
-rw-r--r--net/etebase/files/uwsgi.ini48
-rw-r--r--net/etebase/files/uwsgi.init135
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
+}