From 5b710ed5dcc209829968d5c41213741184f46786 Mon Sep 17 00:00:00 2001 From: Bram van Dartel Date: Mon, 26 Feb 2024 10:48:07 +0100 Subject: [PATCH] log test --- .../s6-rc.d/docker-entrypoint/branding | 15 + .../s6-overlay/s6-rc.d/docker-entrypoint/run | 366 ++++++++++++++++++ .../s6-overlay/s6-rc.d/docker-entrypoint/type | 1 + .../s6-overlay/s6-rc.d/docker-entrypoint/up | 1 + .../s6-rc.d/svc-dsmr-backend/dependencies | 1 + .../s6-rc.d/svc-dsmr-datalogger/dependencies | 1 + .../svc-dsmr-remote-datalogger/dependencies | 1 + .../svc-dsmr-webinterface/dependencies | 1 + .../s6-overlay/s6-rc.d/svc-nginx/dependencies | 1 + .../s6-rc.d/user/contents.d/docker-entrypoint | 0 .../s6-rc.d/user/contents.d/svc-dsmr-backend | 0 .../user/contents.d/svc-dsmr-datalogger | 0 .../contents.d/svc-dsmr-remote-datalogger | 0 .../user/contents.d/svc-dsmr-webinterface | 0 14 files changed, 388 insertions(+) create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/branding create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/run create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/type create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/up create mode 100644 rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-backend/dependencies create mode 100644 rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-datalogger/dependencies create mode 100644 rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-remote-datalogger/dependencies create mode 100644 rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-webinterface/dependencies create mode 100644 rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/docker-entrypoint create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-backend create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-datalogger create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-remote-datalogger create mode 100755 rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-webinterface diff --git a/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/branding b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/branding new file mode 100755 index 0000000..211da7b --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/branding @@ -0,0 +1,15 @@ + + ─────────────────────────────────────────────────── + ___ ___ __ __ ___ ___ _ + | \/ __| \/ | _ \ | _ \___ __ _ __| |___ _ _ + | |) \__ \ |\/| | / | / -_) _` / _` / -_) '_| + |___/|___/_| |_|_|_\ |_|_\___\__,_\__,_\___|_| + __ _ + | \ ___ __| |_____ _ _ + | |) / _ \/ _| / / -_) '_| + |___/\___/\__|_\_\___|_| + + DSMR-protocol reader, telegram data storage and + energy consumption visualizer. + + ─────────────────────────────────────────────────── diff --git a/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/run b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/run new file mode 100755 index 0000000..8d05373 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/run @@ -0,0 +1,366 @@ +#!/command/with-contenv bash + +#--------------------------------------------------------------------------------------------------------------------------- +# VARIABLES +#--------------------------------------------------------------------------------------------------------------------------- +: "${DEBUG:=false}" + +#--------------------------------------------------------------------------------------------------------------------------- +# FUNCTIONS +#--------------------------------------------------------------------------------------------------------------------------- +function _info() { printf "\\r[ \\033[00;34mINFO\\033[0m ] %s\\n" "$@"; } +function _warn() { printf "\\r\\033[2K[ \\033[0;33mWARN\\033[0m ] %s\\n" "$@"; } +function _error() { printf "\\r\\033[2K[ \\033[0;31mFAIL\\033[0m ] %s\\n" "$@"; } +function _debug() { printf "\\r[ \\033[00;37mDBUG\\033[0m ] %s\\n" "$@"; } + +function _pre_reqs() { + _info "DSMR Reader Reader release: ${DSMR_VERSION}" + _info "DSMR Reader Reader Docker release: ${DOCKER_TARGET_RELEASE}" + + cat /etc/s6-overlay/s6-rc.d/docker-entrypoint/branding + + DUID=${DUID:-803} + DGID=${DGID:-803} + + groupmod -o -g "${DGID}" app + usermod -o -u "${DUID}" app + + echo " + ─────────────────────────────────────────────────── + User UID: $(id -u app) + User GID: $(id -g app) + ─────────────────────────────────────────────────── + " + + time32="$(date +%Y)" + + if [[ "${time32}" == "1970" || "${time32}" == "1969" ]] && [[ "$(uname -m)" == "armv7l" ]]; then + echo 'Your DockerHost is running an outdated version of libseccomp. Search internet to fix this!' + sleep infinity + fi + + _info "Ensure permissions..." + chown -R app:app /app + chown -R app:app /config + chown -R app:app /defaults + + _info "Setting architecture requirements..." + _detect_architecture +} + +function _detect_architecture() { + arch=$(uname -m) + # _info "uname -m output: ${arch}" + longbit=$(getconf LONG_BIT) + if [[ "$arch" == 'x86_64' ]]; then + if [[ "$longbit" = '32' ]]; then + arch="i386" + _info "X32 Architecture" + else + arch="amd64" + _info "X64 Architecture" + fi + fi + if [[ "$arch" == 'x86_32' ]]; then + arch="i386" + _info "X32 Architecture" + fi + if [[ "$arch" == 'armv7l' ]]; then + arch="ARM" + _info "ARM Architecture" + fi + if [[ "$arch" == 'aarch64' ]]; then + arch="ARM64" + _info "ARM Architecture" + fi + if [ "$arch" == 'unknown' ]; then + #Assuming amd64, need to address certain distros uname giving "unknown" + arch="amd64" + _info "X64 Architecture" + fi +} + +function _dsmr_datalogger_mode() { + touch /app/.env + if [[ "${DSMRREADER_OPERATION_MODE}" != @(standalone|api_server|api_client) ]]; then + _error "DSMRREADER_OPERATION_MODE required value is incorrect. Exiting..." + exit 1 + else + ################################################ + ## STANDALONE + ################################################ + if [[ "${DSMRREADER_OPERATION_MODE}" = standalone ]]; then + _info "Configuring DSMR Reader to run all processes in a single container with a serial or ipv4 datalogger..." + ################################################ + ## STANDALONE - SERIAL + ################################################ + if [[ "${DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD}" = serial ]]; then + _info "Using a serial connection for the DSMR Reader remote datalogger..." + if [[ -z "${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT}" || -z "${DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE}" || -z "${DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE}" ]]; then + _error "DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT and/or DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE and/or DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE required values are not set. Exiting..." + exit 1 + else + _info "Fixing ${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT} security..." + if ls "${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT}" 1>/dev/null 2>&1; then + chmod 666 "${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT}" + fi + _info "Adding serial input method configuration settings..." + { + echo DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD="${DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD}" + echo DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT="${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PORT}" + echo DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE="${DSMRREADER_REMOTE_DATALOGGER_SERIAL_BAUDRATE}" + echo DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE="${DSMRREADER_REMOTE_DATALOGGER_SERIAL_BYTESIZE}" + echo DSMRREADER_REMOTE_DATALOGGER_SERIAL_PARITY="${DSMRREADER_REMOTE_DATALOGGER_SERIAL_PARITY}" + } >>/app/.env + fi + fi + ################################################ + ## STANDALONE - IPV4 + ################################################ + if [[ "${DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD}" = ipv4 ]]; then + _info "Using an ipv4 network socket for the datalogger..." + if [[ -z "${DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST}" || -z "${DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT}" ]]; then + _error "DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST and/or DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT required values are not set. Exiting..." + exit 1 + else + _info "Adding ipv4 input method configuration settings..." + { + echo DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD="${DSMRREADER_REMOTE_DATALOGGER_INPUT_METHOD}" + echo DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST="${DSMRREADER_REMOTE_DATALOGGER_NETWORK_HOST}" + echo DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT="${DSMRREADER_REMOTE_DATALOGGER_NETWORK_PORT}" + } >>/app/.env + fi + fi + fi + ################################################ + ## API_SERVER + ################################################ + if [[ "${DSMRREADER_OPERATION_MODE}" = api_server ]]; then + _info "Configuring DSMR Reader to run without the datalogger process. A remote datalogger (api_client) is required..." + fi + + ################################################ + ## API_CLIENT + ################################################ + if [[ "${DSMRREADER_OPERATION_MODE}" = api_client ]]; then + _info "Configuring DSMR Reader to only start the api client datalogger (API_CLIENT), which sends the P1 telegrams to the server (API_SERVER)..." + if [[ -z "${DSMRREADER_REMOTE_DATALOGGER_API_HOSTS}" || -z "${DSMRREADER_REMOTE_DATALOGGER_API_KEYS}" ]]; then + _error "DSMRREADER_REMOTE_DATALOGGER_API_HOSTS and/or DSMRREADER_REMOTE_DATALOGGER_API_KEYS required values are not set. Exiting..." + exit 1 + else + _info "Adding remote datalogger (api_client) configuration settings..." + { + echo DSMRREADER_REMOTE_DATALOGGER_API_HOSTS="${DSMRREADER_REMOTE_DATALOGGER_API_HOSTS}" + echo DSMRREADER_REMOTE_DATALOGGER_API_KEYS="${DSMRREADER_REMOTE_DATALOGGER_API_KEYS}" + } >>/app/.env + fi + fi + fi +} + +function _optional_settings() { + if [[ -n "${DSMRREADER_REMOTE_DATALOGGER_TIMEOUT}" ]]; then + _info "Adding DSMRREADER_REMOTE_DATALOGGER_TIMEOUT to the DSMR Reader remote datalogger configuration..." + echo DSMRREADER_REMOTE_DATALOGGER_TIMEOUT="${DSMRREADER_REMOTE_DATALOGGER_TIMEOUT}" >>/app/.env + fi + + if [[ -n "${DSMRREADER_REMOTE_DATALOGGER_SLEEP}" ]]; then + _info "Adding DSMRREADER_REMOTE_DATALOGGER_SLEEP to the DSMR Reader remote datalogger configuration..." + echo DSMRREADER_REMOTE_DATALOGGER_SLEEP="${DSMRREADER_REMOTE_DATALOGGER_SLEEP}" >>/app/.env + fi + + if [[ -n "${DSMRREADER_REMOTE_DATALOGGER_DEBUG_LOGGING}" ]]; then + _info "Adding DSMRREADER_REMOTE_DATALOGGER_DEBUG_LOGGING to the DSMR Reader remote datalogger configuration..." + echo DSMRREADER_REMOTE_DATALOGGER_DEBUG_LOGGING="${DSMRREADER_REMOTE_DATALOGGER_DEBUG_LOGGING^^}" >>/app/.env + fi + + if [[ -n "${DSMRREADER_LOGLEVEL}" ]]; then + _info "Adding DSMRREADER_LOGLEVEL to the DSMR Reader configuration..." + echo DSMRREADER_LOGLEVEL="${DSMRREADER_LOGLEVEL^^}" >>/app/.env + fi +} + +function _check_db_availability() { + _info "Verifying if the DSMR Reader web credential variables have been set..." + if [[ -z "${DSMRREADER_ADMIN_USER}" ]] || [[ -z "${DSMRREADER_ADMIN_PASSWORD}" ]]; then + _error "DSMR Reader web credentials not set. Exiting..." + exit 1 + fi + if [[ -n "${DJANGO_DATABASE_ENGINE}" ]]; then + _info "Verifying database connectivity to host: ${DJANGO_DATABASE_HOST} with port: ${DJANGO_DATABASE_PORT}..." + for i in {1..30}; do + if ! nc -z "${DJANGO_DATABASE_HOST}" "${DJANGO_DATABASE_PORT}"; then + sleep 1 + printf "\\rTesting database connectivity: %s second(s) of 30 seconds..." "$i" + if [[ $i == 30 ]]; then + _error "Database connectivity couldn't be verified! Please verify your settings. Exiting..." + exit 1 + fi + else + _info "Database connectivity successfully verified!" + if [[ "${VACUUM_DB_ON_STARTUP}" = true ]]; then + _cleandb + fi + break + fi + done + fi +} + +function _run_post_config() { + _info "Running post configuration..." + /usr/local/bin/python3 /app/manage.py migrate --noinput + /usr/local/bin/python3 /app/manage.py collectstatic --noinput + /usr/local/bin/python3 /app/manage.py dsmr_superuser +} + +function _nginx_change_listen_port() { + if [[ -z "${ENABLE_NGINX_SSL}" ]]; then + if [[ -n "${NGINX_LISTEN_PORT}" ]]; then + _info "Changing the default internal NGINX listen port to ${NGINX_LISTEN_PORT}..." + sed -i "s/listen\s*80/listen ${NGINX_LISTEN_PORT}/g" /etc/nginx/http.d/dsmr-webinterface.conf + fi + fi +} + +function _nginx_disable_access_logs() { + if [[ -n "${DISABLE_NGINX_ACCESS_LOGS}" ]]; then + _info "Disabling NGINX access logs..." + sed -i '/server_name/ a\ access_log off;' /etc/nginx/http.d/dsmr-webinterface.conf + fi +} + +function _nginx_ssl_configuration() { + _info "Checking for NGINX SSL configuration..." + if [[ -z "${NGINX_LISTEN_PORT}" ]]; then + if [[ -n "${ENABLE_NGINX_SSL}" ]]; then + if [[ "${ENABLE_NGINX_SSL}" = true ]]; then + if [[ ! -f "/etc/ssl/private/fullchain.pem" ]] && [[ ! -f "/etc/ssl/private/privkey.pem" ]]; then + _error "Make sure /etc/ssl/private/fullchain.pem and /etc/ssl/private/privkey.pem are mounted in the Docker container and exist!" + exit 1 + else + _info "Required files /etc/ssl/private/fullchain.pem and /etc/ssl/private/privkey.pem exists." + fi + if grep -q "443" /etc/nginx/http.d/dsmr-webinterface.conf; then + _info "SSL has already been enabled..." + else + sed -i '/listen\s*80/r '<( + cat <<-END_HEREDOC + listen 443 ssl; + ssl_certificate /etc/ssl/private/fullchain.pem; + ssl_certificate_key /etc/ssl/private/privkey.pem; + ssl_protocols TLSv1.2 TLSv1.3; +END_HEREDOC + ) /etc/nginx/http.d/dsmr-webinterface.conf + fi + if nginx -c /etc/nginx/nginx.conf -t 2>/dev/null; then + _info "NGINX SSL configured and enabled" + return + else + _error "NGINX configuration error" + exit 1 + fi + fi + fi + fi + _info "ENABLE_NGINX_SSL is disabled, nothing to see here. Continuing..." +} + +function _generate_auth_configuration() { + _info "Checking for HTTP AUTHENTICATION configuration..." + if [[ -n "${ENABLE_HTTP_AUTH}" ]]; then + if [[ "${ENABLE_HTTP_AUTH}" = true ]]; then + _info "ENABLE_HTTP_AUTH is enabled, let's secure this!" + canWeContinue=true + if [[ -z "${HTTP_AUTH_USERNAME}" ]]; then + _warn "Please provide a HTTP_AUTH_USERNAME" + canWeContinue=false + fi + if [[ -z "${HTTP_AUTH_PASSWORD}" ]]; then + _warn "Please provide a HTTP_AUTH_PASSWORD" + canWeContinue=false + fi + if [[ "${canWeContinue}" = false ]]; then + _error "Cannot generate a valid .htpasswd file, please check above warnings." + exit 1 + fi + _info "Generating htpasswd..." + HTTP_AUTH_CRYPT_PASSWORD=$(openssl passwd -apr1 "${HTTP_AUTH_PASSWORD}") + printf "%s:%s\n" "${HTTP_AUTH_USERNAME}" "${HTTP_AUTH_CRYPT_PASSWORD}" >/etc/nginx/htpasswd + _info "Done! Enabling the configuration in NGINX..." + sed -i "s/## auth_basic/ auth_basic/" /etc/nginx/http.d/dsmr-webinterface.conf + if nginx -c /etc/nginx/nginx.conf -t 2>/dev/null; then + _info "HTTP AUTHENTICATION configured and enabled" + return + else + _error "NGINX configuration error" + exit 1 + fi + fi + fi + _info "ENABLE_HTTP_AUTH is disabled, nothing to see here. Continuing..." +} + +function _generate_clientcert_auth_configuration() { + _info "Checking for CLIENT CERTIFICATE AUTHENTICATION configuration..." + if [[ -n "${ENABLE_CLIENTCERT_AUTH}" ]]; then + if [[ "${ENABLE_CLIENTCERT_AUTH}" = true ]]; then + _info "ENABLE_CLIENTCERT_AUTH is enabled, let's secure this!" + canWeContinue=true + if [[ ! -f /etc/nginx/client_cert/cacert.pem ]]; then + _warn "Please map a CA.pem file to /etc/nginx/client_cert/cacert.pem" + canWeContinue=false + fi + if [[ "${canWeContinue}" = false ]]; then + _error "Sorry, something failed. Please check above warnings." + exit 1 + fi + _info "Enabling the configuration in NGINX..." + sed -i '/server_name _;/a\\tssl_client_certificate /etc/nginx/client_cert/cacert.pem;\n\tssl_verify_client on;' /etc/nginx/http.d/dsmr-webinterface.conf + if [[ -f /etc/nginx/client_cert/ca.crl ]]; then + _info "Found CRL file, adding to configuration..." + sed -i '/server_name _;/a\\tssl_crl /etc/nginx/client_cert/ca.crl;' /etc/nginx/http.d/dsmr-webinterface.conf + fi + if nginx -c /etc/nginx/nginx.conf -t 2>/dev/null; then + _info "CLIENT CERT AUTHENTICATION configured and enabled" + return + else + _error "NGINX configuration error" + exit 1 + fi + fi + fi + _info "ENABLE_CLIENTCERT_AUTH is disabled, nothing to see here. Continuing..." +} + +function _iframe { + if [[ "${ENABLE_IFRAME}" = true ]]; then + _info "Enabling IFrame..." + sed -i "/^from dsmrreader.*/a X_FRAME_OPTIONS = 'ALLOWALL'" /app/dsmrreader/settings.py + fi +} + +function _cleandb { + _info "Vacuum cleaning enabled. Vacuming database..." + /app/cleandb.sh +} + +#--------------------------------------------------------------------------------------------------------------------------- +# MAIN +#--------------------------------------------------------------------------------------------------------------------------- +[[ "${DEBUG}" = true ]] && set -o xtrace + +_pre_reqs + +if [[ "${DSMRREADER_OPERATION_MODE}" != api_client ]]; then + _check_db_availability + _iframe + _run_post_config + _nginx_change_listen_port + _nginx_disable_access_logs + _generate_clientcert_auth_configuration + _nginx_ssl_configuration + _generate_auth_configuration + _dsmr_datalogger_mode + _optional_settings +fi diff --git a/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/type b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/type new file mode 100755 index 0000000..bdd22a1 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/type @@ -0,0 +1 @@ +oneshot diff --git a/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/up b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/up new file mode 100755 index 0000000..a1a9df3 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/docker-entrypoint/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/docker-entrypoint/run \ No newline at end of file diff --git a/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-backend/dependencies b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-backend/dependencies new file mode 100644 index 0000000..7003eb8 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-backend/dependencies @@ -0,0 +1 @@ +docker-entrypoint diff --git a/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-datalogger/dependencies b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-datalogger/dependencies new file mode 100644 index 0000000..7003eb8 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-datalogger/dependencies @@ -0,0 +1 @@ +docker-entrypoint diff --git a/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-remote-datalogger/dependencies b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-remote-datalogger/dependencies new file mode 100644 index 0000000..7003eb8 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-remote-datalogger/dependencies @@ -0,0 +1 @@ +docker-entrypoint diff --git a/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-webinterface/dependencies b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-webinterface/dependencies new file mode 100644 index 0000000..7003eb8 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/svc-dsmr-webinterface/dependencies @@ -0,0 +1 @@ +docker-entrypoint diff --git a/rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies b/rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies new file mode 100644 index 0000000..7003eb8 --- /dev/null +++ b/rootfs/etc/s6-overlay/s6-rc.d/svc-nginx/dependencies @@ -0,0 +1 @@ +docker-entrypoint diff --git a/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/docker-entrypoint b/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/docker-entrypoint new file mode 100755 index 0000000..e69de29 diff --git a/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-backend b/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-backend new file mode 100755 index 0000000..e69de29 diff --git a/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-datalogger b/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-datalogger new file mode 100755 index 0000000..e69de29 diff --git a/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-remote-datalogger b/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-remote-datalogger new file mode 100755 index 0000000..e69de29 diff --git a/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-webinterface b/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-dsmr-webinterface new file mode 100755 index 0000000..e69de29