From 4ccda2a36c0ffe58798a784be75cd1f3b00e58c5 Mon Sep 17 00:00:00 2001 From: mlan Date: Fri, 18 Dec 2020 11:04:09 +0100 Subject: [PATCH] - [kopano](src/kopano/entry.d/10-kopano-common) Allow module based parameter names. - [docker](src/docker/bin/docker-config.sh) Add provision to set up crontab using envvars. --- CHANGELOG.md | 4 ++- Dockerfile | 10 +++++- ROADMAP.md | 28 +++++++--------- demo/Makefile | 3 ++ src/docker/bin/docker-config.sh | 14 ++++++++ src/docker/config/docker-crontab | 7 ++++ src/docker/entry.d/50-docker-crontab-entry | 15 +++++++++ src/kopano/entry.d/10-kopano-common | 38 ++++++++++++++-------- 8 files changed, 87 insertions(+), 32 deletions(-) create mode 100644 src/docker/config/docker-crontab create mode 100755 src/docker/entry.d/50-docker-crontab-entry diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cd4b80..454aed6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,12 @@ # 1.2.5 -- [docker](Dockerfile) Install [kopano archiver](https://documentation.kopano.io/kopano_archiver_manual/) in target `core`. +- [docker](Dockerfile) Install the [kopano archiver](https://documentation.kopano.io/kopano_archiver_manual/) in target `core`. - [docker](Dockerfile) Install the smime webapp plugin providing [S/MIME](https://kopano.com/blog/s-mime-plugin-description/). - [docker](Dockerfile) Install the mdm webapp plugin providing [Mobile Device Management](https://documentation.kopano.io/webapp_mdm_manual/). - [demo](demo) Add [S/MIME](https://kopano.com/blog/s-mime-plugin-description/) cert generation. - [kopano](src/kopano/entry.d/10-kopano-common) Fix bug in `kopano_apply_envvars_php()`. +- [kopano](src/kopano/entry.d/10-kopano-common) Allow module based parameter names. +- [docker](src/docker/bin/docker-config.sh) Add provision to set up crontab using envvars. # 1.2.4 diff --git a/Dockerfile b/Dockerfile index a71b3a3..29ac3b1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,8 @@ ENV DEBIAN_FRONTEND=noninteractive \ DOCKER_BIN_DIR=/usr/local/bin \ DOCKER_ENTRY_DIR=/etc/docker/entry.d \ DOCKER_EXIT_DIR=/etc/docker/exit.d \ + DOCKER_CRONTAB_FILE=/etc/kopano/docker-crontab \ + DOCKER_CRONTAB_DIR=/etc/cron.d \ DOCKER_CONF_DIR1=/etc/kopano \ DOCKER_CONF_DIR2=/usr/share/z-push \ DOCKER_APPL_LIB=/var/lib/kopano \ @@ -31,6 +33,7 @@ ENV DEBIAN_FRONTEND=noninteractive \ COPY src/*/bin $DOCKER_BIN_DIR/ COPY src/*/entry.d $DOCKER_ENTRY_DIR/ COPY src/*/exit.d $DOCKER_EXIT_DIR/ +COPY src/*/config $DOCKER_CONF_DIR1/ # # Install helpers. Set bash as default shell. Setup syslogs service. @@ -46,7 +49,12 @@ RUN apt-get update && apt-get install --yes --no-install-recommends \ gnupg \ jq \ inotify-tools \ - && docker-service.sh "syslogd -nO- -l$SYSLOG_LEVEL $SYSLOG_OPTIONS" + cron \ + && ln -s $DOCKER_CRONTAB_FILE $DOCKER_CRONTAB_DIR \ + && docker-service.sh \ + "syslogd -nO- -l$SYSLOG_LEVEL $SYSLOG_OPTIONS" \ + "cron -f" +# "cron -f -L 4" diff --git a/ROADMAP.md b/ROADMAP.md index c491ee4..61a67cf 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,5 +1,16 @@ # Road map +## Overlapping parameters + +`MYSQL_HOST=db` +`SERVER_MYSQL_HOST=db-srv` +`ARCHIVER_MYSQL_HOST=db-arc` + +## Cron + +`CRONTAB_ENTRY1=0 1 * * * root kopano-archiver -A` +`CRONTAB_ENTRY2=0 3 * * 0 root kopano-archiver -C` + ## kDAV Consider integrating support for kDAV which provides CalDAV and CardDAV. @@ -16,20 +27,3 @@ Consider to also consolidating it under /srv to simplify making it persistent? ## webapp-passwd Integrate [webapp-passwd](https://github.com/silentsakky/zarafa-webapp-passwd)? - -## Improve Health Check? - -Verify the user anonymously. -```bash -ldapsearch -h dockerhost -xLLL -b dc=example,dc=com '(kopanoAccount=1)' -``` - -Check if kopano can get the user from LDAP -```bash -kopano-admin -l -``` -check that apache and mysql is running -```bash -apache2ctl status -mysqlcheck -A -``` diff --git a/demo/Makefile b/demo/Makefile index 5f2c12b..0480e98 100644 --- a/demo/Makefile +++ b/demo/Makefile @@ -55,6 +55,9 @@ $(addsuffix -top,$(srv_list)): $(addsuffix -logs,$(srv_list)): docker-compose logs $(patsubst %-logs,%,$@) +$(addsuffix -pull,$(srv_list)): + docker-compose pull $(patsubst %-pull,%,$@) + $(addsuffix -sh,$(srv_list)): docker-compose exec $(patsubst %-sh,%,$@) sh -c 'exec $$(getent passwd root | sed "s/.*://g")' diff --git a/src/docker/bin/docker-config.sh b/src/docker/bin/docker-config.sh index 0cafd3a..860aea5 100644 --- a/src/docker/bin/docker-config.sh +++ b/src/docker/bin/docker-config.sh @@ -11,6 +11,8 @@ HOSTNAME=${HOSTNAME-$(hostname)} DOMAIN=${HOSTNAME#*.} TLS_KEYBITS=${TLS_KEYBITS-2048} TLS_CERTDAYS=${TLS_CERTDAYS-30} +DOCKER_CRONTAB_FILE=${DOCKER_CRONTAB_FILE-/etc/crontab} +DOCKER_CRONTAB_ENV=${DOCKER_CRONTAB_ENV-CRONTAB_ENTRY} # # general file manipulation commands, used both during build and run time @@ -232,6 +234,18 @@ dc_prune_pidfiles() { done } +# +# Setup crontab entries +# +dc_crontab_entries() { + local entries="$(eval echo \${!$DOCKER_CRONTAB_ENV*})" + for entry in $entries; do + [ -z "${changed+x}" ] && local changed= && sed -i '/^#$/q' $DOCKER_CRONTAB_FILE + echo "${!entry}" >> $DOCKER_CRONTAB_FILE + dc_log 5 "Added entry ${!entry} in $DOCKER_CRONTAB_FILE" + done +} + # # TLS/SSL Certificates [openssl] # diff --git a/src/docker/config/docker-crontab b/src/docker/config/docker-crontab new file mode 100644 index 0000000..2d30738 --- /dev/null +++ b/src/docker/config/docker-crontab @@ -0,0 +1,7 @@ +# /etc/cron.d/docker-crontab: crontab entries for docker + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# During initialization CRONTAB_ENTRY envvars will overwrite everything after +# the first line with a single #. Don't change the next line. +# diff --git a/src/docker/entry.d/50-docker-crontab-entry b/src/docker/entry.d/50-docker-crontab-entry new file mode 100755 index 0000000..2462b56 --- /dev/null +++ b/src/docker/entry.d/50-docker-crontab-entry @@ -0,0 +1,15 @@ +#!/bin/sh +# +# 50-docker-crontab-entry +# +# Functions defined in: +# docker-config.sh +# +# + +# +# Add crontab entries if the config is unlocked. +# +if dc_is_unlocked; then + dc_crontab_entries +fi diff --git a/src/kopano/entry.d/10-kopano-common b/src/kopano/entry.d/10-kopano-common index b79405c..aa5fa83 100755 --- a/src/kopano/entry.d/10-kopano-common +++ b/src/kopano/entry.d/10-kopano-common @@ -18,6 +18,7 @@ DOCKER_MAN5_DIR=${DOCKER_MAN5_DIR-/usr/share/man/man5/} DOCKER_APPL_SSL_CERT=${DOCKER_APPL_SSL_CERT-$DOCKER_APPL_SSL_DIR/cert.pem} DOCKER_APPL_SSL_KEY=${DOCKER_APPL_SSL_KEY-$DOCKER_APPL_SSL_DIR/priv_key.pem} DOCKER_LDAP_PMAP_FILE=${DOCKER_LDAP_PMAP_FILE-/usr/share/kopano/ldap.propmap.cfg} +DOCKER_LDAP_SERVICES=${DOCKER_LDAP_SERVICES-archiver dagent gateway ical ldap search server spamd spooler} sqlstate_cfg_file=$DOCKER_CONF_DIR2/backend/sqlstatemachine/config.php zpush_cfg_file=$DOCKER_CONF_DIR2/config.php webapp_cfg_file=$DOCKER_CONF_DIR1/webapp/config.php @@ -32,7 +33,7 @@ webapp_smime_cfg_file=$DOCKER_CONF_DIR1/webapp/config-smime.php # With kopano-webapp and z-push use installed config file to find valid keys. # kopano_apply_envvars_core() { - for service in dagent gateway ical ldap search server spamd spooler; do + for service in $DOCKER_LDAP_SERVICES; do kopano_apply_envvars_cfg $service done } @@ -48,16 +49,20 @@ kopano_apply_envvars_zpush() { kopano_apply_envvars_php $zpush_cfg_file } +# +# kopano_apply_envvars_cfg +# kopano_apply_envvars_cfg() { - local cfg_file=$(kopano_gen_filename_cfg $1) - local man_file=$(kopano_gen_filename_man $1) + local service=$1 + local cfg_file=$(kopano_gen_filename_cfg $service) + local man_file=$(kopano_gen_filename_man $service) if [ -f $man_file ]; then local env_vars="$(kopano_get_envvars_man $man_file)" if [ -e $cfg_file ]; then mv -f $cfg_file $cfg_file.bak fi for env_var in $env_vars; do - kopano_set_envvars_cfg $cfg_file $env_var + kopano_set_envvars_cfg $service $env_var done else dc_log 4 "Could not find $man_file" @@ -70,25 +75,31 @@ kopano_apply_envvars_php() { local env_vars="$(kopano_get_envvars_php $cfg_file)" for env_var in $env_vars; do if [ -n "${!env_var}" ]; then - [ -z "${changed+x}" ] && cp -f $cfg_file $cfg_file.bak + [ -z "${changed+x}" ] && local changed= && cp -f $cfg_file $cfg_file.bak dc_log 5 "Setting ${env_var} = ${!env_var} in $cfg_file" sed -ri "s/(\s*define[('\"]+${env_var}['\",]+).+/\1 ${!env_var});/Ig" $cfg_file - local changed fi done fi } # -# kopano_set_envvars_cfg [explicit parameter name] +# kopano_set_envvars_cfg [explicit parameter name] # kopano_set_envvars_cfg() { - local cfg_file=$1 + local service=$1 + local cfg_file=$(kopano_gen_filename_cfg $service) local env_var=$2 + local uniq_var=${service^^}_${env_var} local cfg_par="${3-$env_var =}" - if [ -n "${!env_var+x}" ]; then - dc_log 5 "Setting ${cfg_par,,} ${!env_var} in $cfg_file" - echo ${cfg_par,,} ${!env_var} >> $cfg_file + if [ -n "${!uniq_var+x}" ]; then + local env_val="${!uniq_var}" + elif [ -n "${!env_var+x}" ]; then + local env_val="${!env_var}" + fi + if [ -n "${env_val+x}" ]; then + dc_log 5 "Setting ${cfg_par,,} ${env_val} in $cfg_file" + echo ${cfg_par,,} ${env_val} >> $cfg_file fi } @@ -135,7 +146,8 @@ kopano_generate_tls_cert() { # LDAP directives # kopano_apply_envvar_propmap() { - local cfg_file=$(kopano_gen_filename_cfg ldap) + local service=ldap + local cfg_file=$(kopano_gen_filename_cfg $service) local env_var=LDAP_PROPMAP if [ -n "${!env_var+x}" ]; then if [ -z "${!env_var}" ]; then @@ -144,6 +156,6 @@ kopano_apply_envvar_propmap() { dc_log 5 "No ${!env_var} so copying $DOCKER_LDAP_PMAP_FILE there." cp -f $DOCKER_LDAP_PMAP_FILE ${!env_var} fi - kopano_set_envvars_cfg $cfg_file $env_var '!propmap' + kopano_set_envvars_cfg $service $env_var '!propmap' fi }