mirror of
				https://github.com/zokradonh/kopano-docker
				synced 2025-10-31 10:27:14 +00:00 
			
		
		
		
	implement new env variable to disable all automatic actions (#434)
* implement new env variable to disable all automatic actions fixes https://github.com/zokradonh/kopano-docker/issues/360 * wrap the remaining services in checks if autoconfigure/disable_checks is used * move definition of AUTOCONFIGURE variable into base image * add logic to kapps and kdav container * add autoconfigure to konnect container * update build stage to latest golang * add autoconfig to remaining images * delete obsolete apache config in z-push folder * when specifying config paths use KOPANO_CONFIG_PATH * also use env variable in helper scripts * add message about removal of kopano-cli
This commit is contained in:
		
							parent
							
								
									3d7ff97aab
								
							
						
					
					
						commit
						d514ef44cb
					
				| @ -11,6 +11,7 @@ ARG KOPANO_UID=999 | ||||
| ARG KOPANO_GID=999 | ||||
| 
 | ||||
| ENV \ | ||||
|     AUTOCONFIGURE=true \ | ||||
|     BASE_VERSION=2.2.0 \ | ||||
|     DEBIAN_FRONTEND=noninteractive \ | ||||
|     DEBUG="" | ||||
|  | ||||
| @ -1,3 +1,3 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| /usr/sbin/kopano-autorespond -C /tmp/kopano/autorespond.cfg "$@" | ||||
| /usr/sbin/kopano-autorespond -C "$KOPANO_CONFIG_PATH/autorespond.cfg" "$@" | ||||
|  | ||||
| @ -1,3 +1,8 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| /usr/sbin/kopano-cli --config /tmp/kopano/admin.cfg "$@" | ||||
| if [ ! -f /usr/sbin/kopano-cli ]; then | ||||
| 	echo "kopano-cli has been removed from Kopano Groupware Core 10 and upwards. Please use kopano-admin instead." | ||||
| 	exit 1 | ||||
| fi | ||||
| 
 | ||||
| /usr/sbin/kopano-cli --config "$KOPANO_CONFIG_PATH/admin.cfg" "$@" | ||||
|  | ||||
| @ -4,6 +4,7 @@ set -eu # unset variables are errors & non-zero return values exit the whole scr | ||||
| [ "$DEBUG" ] && set -x | ||||
| 
 | ||||
| ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | ||||
| AUTOCONFIGURE=${AUTOCONFIGURE:-true} # when set to false will disable all automatic configuration actions | ||||
| KCCONF_SERVER_MYSQL_SOCKET=${KCCONF_SERVER_MYSQL_SOCKET:-""} | ||||
| DISABLE_CHECKS=${DISABLE_CHECKS:-false} | ||||
| DISABLE_CONFIG_CHANGES=${DISABLE_CONFIG_CHANGES:-false} | ||||
| @ -16,47 +17,50 @@ KCCONF_SPOOLER_SERVER_SOCKET=${KCCONF_SPOOLER_SERVER_SOCKET:-"file:///var/run/ko | ||||
| KOPANO_CON=${KOPANO_CON:-"file:///var/run/kopano/server.sock"} | ||||
| KCCONF_SPOOLER_SMTP_SERVER=${KCCONF_SPOOLER_SMTP_SERVER:-mail} | ||||
| KCCONF_SPOOLER_SMTP_PORT=${KCCONF_SPOOLER_SMTP_PORT:-25} | ||||
| KOPANO_CONFIG_PATH=${KOPANO_CONFIG_PATH:-/tmp/kopano} | ||||
| 
 | ||||
| # copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||
| mkdir -p /tmp/kopano | ||||
| cp /etc/kopano/*.cfg /tmp/kopano | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# copy configuration files to /tmp/kopano (default value of $KOPANO_CONFIG_PATH)  to prevent modification of mounted config files | ||||
| 	mkdir -p /tmp/kopano | ||||
| 	cp /etc/kopano/*.cfg /tmp/kopano | ||||
| 
 | ||||
| if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | ||||
| 	echo "Invalid service specified: $SERVICE_TO_START" | ts | ||||
| 	exit 1 | ||||
| 	if [ ! -e /kopano/"$SERVICE_TO_START".py ]; then | ||||
| 		echo "Invalid service specified: $SERVICE_TO_START" | ts | ||||
| 		exit 1 | ||||
| 	fi | ||||
| 
 | ||||
| 	# Hint: this is not compatible with a read-only container. | ||||
| 	# The general recommendation is to already build a container that has all required packages installed. | ||||
| 	ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| 	if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 			# shellcheck disable=SC2016 disable=SC2086 | ||||
| 			if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 				DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 			else | ||||
| 				echo "INFO: $installpkg is already installed" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		echo "Notice: Container is run read-only, skipping package installation." | ||||
| 		echo "If you want to have additional packages installed in the container either:" | ||||
| 		echo "- build your own image with the packages already included" | ||||
| 		echo "- switch the container to 'read_only: false'" | ||||
| 	fi | ||||
| 
 | ||||
| 	mkdir -p /tmp/"$SERVICE_TO_START" /var/run/kopano | ||||
| 
 | ||||
| 	# TODO is this still required now that we won't modify configuration mounted to /etc/kopano? | ||||
| 	if [ "${DISABLE_CONFIG_CHANGES}" == false ]; then | ||||
| 		echo "Configure core service '$SERVICE_TO_START'" | ts | ||||
| 		/kopano/"$SERVICE_TO_START".py | ||||
| 	fi | ||||
| 
 | ||||
| 	# ensure removed pid-file on unclean shutdowns and mounted volumes | ||||
| 	rm -f /var/run/kopano/"$SERVICE_TO_START".pid | ||||
| fi | ||||
| 
 | ||||
| # Hint: this is not compatible with a read-only container. | ||||
| # The general recommendation is to already build a container that has all required packages installed. | ||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 		# shellcheck disable=SC2016 disable=SC2086 | ||||
| 		if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 			DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 		else | ||||
| 			echo "INFO: $installpkg is already installed" | ||||
| 		fi | ||||
| 	done | ||||
| else | ||||
| 	echo "Notice: Container is run read-only, skipping package installation." | ||||
| 	echo "If you want to have additional packages installed in the container either:" | ||||
| 	echo "- build your own image with the packages already included" | ||||
| 	echo "- switch the container to 'read_only: false'" | ||||
| fi | ||||
| 
 | ||||
| mkdir -p /tmp/"$SERVICE_TO_START" /var/run/kopano | ||||
| 
 | ||||
| # TODO is this still required now that we won't modify configuration mounted to /etc/kopano? | ||||
| if [ "${DISABLE_CONFIG_CHANGES}" == false ]; then | ||||
| 	echo "Configure core service '$SERVICE_TO_START'" | ts | ||||
| 	/kopano/"$SERVICE_TO_START".py | ||||
| fi | ||||
| 
 | ||||
| # ensure removed pid-file on unclean shutdowns and mounted volumes | ||||
| rm -f /var/run/kopano/"$SERVICE_TO_START".pid | ||||
| 
 | ||||
| coreversion=$(dpkg-query --showformat='${Version}' --show kopano-server) | ||||
| echo "Using Kopano Groupware Core: $coreversion" | ||||
| 
 | ||||
| @ -67,7 +71,7 @@ if [ $# -gt 0 ]; then | ||||
| fi | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| if [[ "$DISABLE_CHECKS" == false  ]]; then | ||||
| if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
| @ -119,78 +123,88 @@ fi | ||||
| # start regular service | ||||
| case "$SERVICE_TO_START" in | ||||
| server) | ||||
| 	echo "Set ownership" | ts | ||||
| 	mkdir -p /kopano/data/attachments | ||||
| 	chown kopano:kopano /kopano/data/ /kopano/data/attachments | ||||
| 	 | ||||
| 	if [[ "$DISABLE_CHECKS" == false ]]; then | ||||
| 		# determine db connection mode (unix vs. network socket) | ||||
| 		if [ -n "$KCCONF_SERVER_MYSQL_SOCKET" ]; then | ||||
| 			DB_CON="file://$KCCONF_SERVER_MYSQL_SOCKET" | ||||
| 		else | ||||
| 			DB_CON="tcp://$KCCONF_SERVER_MYSQL_HOST:$KCCONF_SERVER_MYSQL_PORT" | ||||
| 		fi | ||||
| 	if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 		echo "Set ownership" | ts | ||||
| 		mkdir -p /kopano/data/attachments | ||||
| 		chown kopano:kopano /kopano/data/ /kopano/data/attachments | ||||
| 
 | ||||
| 		dockerize \ | ||||
| 			-wait file://"$KCCONF_SERVER_SERVER_SSL_CA_FILE" \ | ||||
| 			-wait file://"$KCCONF_SERVER_SERVER_SSL_KEY_FILE" \ | ||||
| 			-wait "$DB_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# pre populate database | ||||
| 	if dpkg --compare-versions "$coreversion" "gt" "8.7.84"; then | ||||
| 		kopano-dbadm -c /tmp/kopano/server.cfg populate | ||||
| 		if [[ "$DISABLE_CHECKS" == false ]]; then | ||||
| 			# determine db connection mode (unix vs. network socket) | ||||
| 			if [ -n "$KCCONF_SERVER_MYSQL_SOCKET" ]; then | ||||
| 				DB_CON="file://$KCCONF_SERVER_MYSQL_SOCKET" | ||||
| 			else | ||||
| 				DB_CON="tcp://$KCCONF_SERVER_MYSQL_HOST:$KCCONF_SERVER_MYSQL_PORT" | ||||
| 			fi | ||||
| 
 | ||||
| 			dockerize \ | ||||
| 				-wait file://"$KCCONF_SERVER_SERVER_SSL_CA_FILE" \ | ||||
| 				-wait file://"$KCCONF_SERVER_SERVER_SSL_KEY_FILE" \ | ||||
| 				-wait "$DB_CON" \ | ||||
| 				-timeout 360s | ||||
| 		fi | ||||
| 		# pre populate database | ||||
| 		if dpkg --compare-versions "$coreversion" "gt" "8.7.84"; then | ||||
| 			kopano-dbadm -c "$KOPANO_CONFIG_PATH/server.cfg" populate | ||||
| 		fi | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -F | ||||
| 	;; | ||||
| dagent) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -l | ||||
| 	;; | ||||
| gateway) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -F | ||||
| 	;; | ||||
| ical) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -F | ||||
| 	;; | ||||
| grapi) | ||||
| 	LC_CTYPE=en_US.UTF-8 | ||||
| 	export socket_path=/var/run/kopano/grapi | ||||
| 	export pid_file="$socket_path/grapi.pid" | ||||
| 	mkdir -p "$socket_path" /var/lib/kopano-grapi | ||||
| 	chown -R kapi:kopano "$socket_path" | ||||
| 	chown kapi:kopano /var/lib/kopano-grapi | ||||
| 	# TODO there could be a case where multiple backends are desired | ||||
| 	case $GRAPI_BACKEND in | ||||
| 	ldap) | ||||
| 		[ -n "$KCCONF_GRAPI_LDAP_URI" ] && export LDAP_URI="${KCCONF_GRAPI_LDAP_URI}" | ||||
| 		[ -n "$KCCONF_GRAPI_LDAP_BASEDN" ] && export LDAP_BASEDN="${KCCONF_GRAPI_LDAP_BASEDN}" | ||||
| 		[ -n "$KCCONF_GRAPI_LDAP_BINDDN" ] && export LDAP_BINDDN="${KCCONF_GRAPI_LDAP_BINDDN}" | ||||
| 		if [ -n "$KCCONF_GRAPI_LDAP_BINDPW_FILE" ]; then | ||||
| 			bindpw="$(cat "${KCCONF_GRAPI_LDAP_BINDPW_FILE}")" | ||||
| 			export LDAP_BINDPW="${bindpw}" | ||||
| 		fi | ||||
| 		;; | ||||
| 	esac | ||||
| 	sed s/\ *=\ */=/g /tmp/kopano/grapi.cfg > /tmp/grapi-env | ||||
| 	# shellcheck disable=SC2046 | ||||
| 	export $(grep -v '^#' /tmp/grapi-env | xargs -d '\n') | ||||
| 	if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 		LC_CTYPE=en_US.UTF-8 | ||||
| 		export socket_path=/var/run/kopano/grapi | ||||
| 		export pid_file="$socket_path/grapi.pid" | ||||
| 		mkdir -p "$socket_path" /var/lib/kopano-grapi | ||||
| 		chown -R kapi:kopano "$socket_path" | ||||
| 		chown kapi:kopano /var/lib/kopano-grapi | ||||
| 		# TODO there could be a case where multiple backends are desired | ||||
| 		case $GRAPI_BACKEND in | ||||
| 		ldap) | ||||
| 			[ -n "$KCCONF_GRAPI_LDAP_URI" ] && export LDAP_URI="${KCCONF_GRAPI_LDAP_URI}" | ||||
| 			[ -n "$KCCONF_GRAPI_LDAP_BASEDN" ] && export LDAP_BASEDN="${KCCONF_GRAPI_LDAP_BASEDN}" | ||||
| 			[ -n "$KCCONF_GRAPI_LDAP_BINDDN" ] && export LDAP_BINDDN="${KCCONF_GRAPI_LDAP_BINDDN}" | ||||
| 			if [ -n "$KCCONF_GRAPI_LDAP_BINDPW_FILE" ]; then | ||||
| 				bindpw="$(cat "${KCCONF_GRAPI_LDAP_BINDPW_FILE}")" | ||||
| 				export LDAP_BINDPW="${bindpw}" | ||||
| 			fi | ||||
| 			;; | ||||
| 		esac | ||||
| 		sed s/\ *=\ */=/g "$KOPANO_CONFIG_PATH/grapi.cfg" > /tmp/grapi-env | ||||
| 		# shellcheck disable=SC2046 | ||||
| 		export $(grep -v '^#' /tmp/grapi-env | xargs -d '\n') | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	# the backend option is only available in more recent versions of grapi | ||||
| @ -203,65 +217,75 @@ grapi) | ||||
| 	fi | ||||
| 	;; | ||||
| kapi) | ||||
| 	mkdir -p /kopano/data/kapi-kvs | ||||
| 	if [ "$KCCONF_KAPID_INSECURE" = "yes" ]; then | ||||
| 		dockerize \ | ||||
| 		-skip-tls-verify \ | ||||
| 		-wait "$KCCONF_KAPID_OIDC_ISSUER_IDENTIFIER"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	else | ||||
| 		dockerize \ | ||||
| 		-wait "$KCCONF_KAPID_OIDC_ISSUER_IDENTIFIER"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 		mkdir -p /kopano/data/kapi-kvs | ||||
| 		if [ "$KCCONF_KAPID_INSECURE" = "yes" ]; then | ||||
| 			dockerize \ | ||||
| 			-skip-tls-verify \ | ||||
| 			-wait "$KCCONF_KAPID_OIDC_ISSUER_IDENTIFIER"/.well-known/openid-configuration \ | ||||
| 			-timeout 360s | ||||
| 		else | ||||
| 			dockerize \ | ||||
| 			-wait "$KCCONF_KAPID_OIDC_ISSUER_IDENTIFIER"/.well-known/openid-configuration \ | ||||
| 			-timeout 360s | ||||
| 		fi | ||||
| 		LC_CTYPE=en_US.UTF-8 | ||||
| 		sed s/\ *=\ */=/g "$KOPANO_CONFIG_PATH/kapid.cfg" > /tmp/kapid-env | ||||
| 		# shellcheck disable=SC2046 | ||||
| 		export $(grep -v '^#' /tmp/kapid-env | xargs -d '\n') | ||||
| 		"$EXE" setup | ||||
| 	fi | ||||
| 	kapiversion=$(dpkg-query --showformat='${Version}' --show kopano-kapid) | ||||
| 	echo "Using Kopano Kapi: $kapiversion" | ||||
| 	LC_CTYPE=en_US.UTF-8 | ||||
| 	sed s/\ *=\ */=/g /tmp/kopano/kapid.cfg > /tmp/kapid-env | ||||
| 	# shellcheck disable=SC2046 | ||||
| 	export $(grep -v '^#' /tmp/kapid-env | xargs -d '\n') | ||||
| 	"$EXE" setup | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	kapiversion=$(dpkg-query --showformat='${Version}' --show kopano-kapid) | ||||
| 	echo "Using Kopano Kapi: $kapiversion" | ||||
| 	exec "$EXE" serve --log-timestamp=false | ||||
| 	;; | ||||
| monitor) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -F | ||||
| 	;; | ||||
| search) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	# give kopano-server a moment to settler before starting search | ||||
| 	sleep 5 | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 		# give kopano-server a moment to settler before starting search | ||||
| 		sleep 5 | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	# with commit 702bb3fccb3 search does not need -F any longer | ||||
| 	searchversion=$(dpkg-query --showformat='${Version}' --show kopano-search) | ||||
| 	if dpkg --compare-versions "$searchversion" "gt" "8.7.82.165"; then | ||||
| 		exec "$EXE" --config /tmp/kopano/search.cfg | ||||
| 		exec "$EXE" --config "$KOPANO_CONFIG_PATH/search.cfg" | ||||
| 	else | ||||
| 		exec /usr/bin/python3 "$EXE" --config /tmp/kopano/search.cfg -F | ||||
| 		exec /usr/bin/python3 "$EXE" --config "$KOPANO_CONFIG_PATH/search.cfg" -F | ||||
| 	fi | ||||
| 	;; | ||||
| spamd) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-timeout 360s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-timeout 360s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" --config /tmp/kopano/spamd.cfg -F | ||||
| 	exec "$EXE" --config "$KOPANO_CONFIG_PATH/spamd.cfg" -F | ||||
| 	;; | ||||
| spooler) | ||||
| 	dockerize \ | ||||
| 		-wait "$KOPANO_CON" \ | ||||
| 		-wait tcp://"$KCCONF_SPOOLER_SMTP_SERVER":"$KCCONF_SPOOLER_SMTP_PORT" \ | ||||
| 		-timeout 1080s | ||||
| 	if [ "${AUTOCONFIGURE}" == true ] && [ "$DISABLE_CHECKS" == false ]; then | ||||
| 		dockerize \ | ||||
| 			-wait "$KOPANO_CON" \ | ||||
| 			-wait tcp://"$KCCONF_SPOOLER_SMTP_SERVER":"$KCCONF_SPOOLER_SMTP_PORT" \ | ||||
| 			-timeout 1080s | ||||
| 	fi | ||||
| 	# cleaning up env variables | ||||
| 	unset "${!KCCONF_@}" | ||||
| 	exec "$EXE" -F | ||||
|  | ||||
| @ -1,16 +1,19 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | ||||
| AUTOCONFIGURE=${AUTOCONFIGURE:-true} # when set to false will disable all automatic configuration actions | ||||
| 
 | ||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | ||||
| [ "$DEBUG" ] && set -x | ||||
| 
 | ||||
| # copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||
| mkdir -p /tmp/kopano | ||||
| cp /etc/kopano/*.cfg /tmp/kopano | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||
| 	mkdir -p /tmp/kopano | ||||
| 	cp /etc/kopano/*.cfg /tmp/kopano | ||||
| 
 | ||||
| echo "Applying cfg changes from env" | ||||
| /usr/bin/python3 /kopano/cfg-from-env.py | ||||
| 	echo "Applying cfg changes from env" | ||||
| 	/usr/bin/python3 /kopano/cfg-from-env.py | ||||
| fi | ||||
| 
 | ||||
| meetversion=$(dpkg-query --showformat='${Version}' --show kopano-calendar-webapp) | ||||
| echo "Using Kopano Calendar: $meetversion" | ||||
| @ -21,58 +24,60 @@ if [ $# -gt 0 ]; then | ||||
| 	exit | ||||
| fi | ||||
| 
 | ||||
| cp /usr/share/doc/kopano-calendar-webapp/config.json.in /tmp/calendar.json | ||||
| CONFIG_JSON="/tmp/calendar.json" | ||||
| # TODO move into extra file to make it easier to reuse | ||||
| echo "Updating $CONFIG_JSON" | ||||
| for setting in $(compgen -A variable KCCONF_CALENDAR); do | ||||
| 	setting2=${setting#KCCONF_CALENDAR_} | ||||
| 	# dots in setting2 need to be escaped to not be handled as separate entities in the json file | ||||
| 	case ${!setting} in | ||||
| 		true|TRUE|false|FALSE|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) | ||||
| 			jq ".\"${setting2//_/\".\"}\" = ${!setting}" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 			;; | ||||
| 		*) | ||||
| 			jq ".\"${setting2//_/\".\"}\" = \"${!setting}\"" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 			;; | ||||
| 		esac | ||||
| done | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	cp /usr/share/doc/kopano-calendar-webapp/config.json.in /tmp/calendar.json | ||||
| 	CONFIG_JSON="/tmp/calendar.json" | ||||
| 	# TODO move into extra file to make it easier to reuse | ||||
| 	echo "Updating $CONFIG_JSON" | ||||
| 	for setting in $(compgen -A variable KCCONF_CALENDAR); do | ||||
| 		setting2=${setting#KCCONF_CALENDAR_} | ||||
| 		# dots in setting2 need to be escaped to not be handled as separate entities in the json file | ||||
| 		case ${!setting} in | ||||
| 			true|TRUE|false|FALSE|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) | ||||
| 				jq ".\"${setting2//_/\".\"}\" = ${!setting}" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 				;; | ||||
| 			*) | ||||
| 				jq ".\"${setting2//_/\".\"}\" = \"${!setting}\"" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 				;; | ||||
| 			esac | ||||
| 	done | ||||
| 
 | ||||
| # Populate app grid | ||||
| # TODO move into extra file to make it easier to reuse | ||||
| # Note: if all of below variables are set to "no" kpop will fall back to its default behaviour and show all known apps. | ||||
| 	# Populate app grid | ||||
| 	# TODO move into extra file to make it easier to reuse | ||||
| 	# Note: if all of below variables are set to "no" kpop will fall back to its default behaviour and show all known apps. | ||||
| 
 | ||||
| # enable Kopano Konnect in the app grid | ||||
| if [ "${GRID_KONNECT:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-konnect"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	# enable Kopano Konnect in the app grid | ||||
| 	if [ "${GRID_KONNECT:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-konnect"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano Meet in the app grid | ||||
| 	if [ "${GRID_MEET:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-meet"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano WebApp in the app grid | ||||
| 	if [ "${GRID_WEBAPP:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano WebApp in the app grid | ||||
| 	if [ "${GRID_CALENDAR:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-calendar"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	sed s/\ *=\ */=/g /tmp/kopano/kwebd.cfg > /tmp/kweb-env | ||||
| 	# always disable tls | ||||
| 	export tls=no | ||||
| 	# shellcheck disable=SC2046 | ||||
| 	export $(grep -v '^#' /tmp/kweb-env | xargs -d '\n') | ||||
| 
 | ||||
| 	# services need to be aware of the machine-id | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano Meet in the app grid | ||||
| if [ "${GRID_MEET:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-meet"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano WebApp in the app grid | ||||
| if [ "${GRID_WEBAPP:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano WebApp in the app grid | ||||
| if [ "${GRID_CALENDAR:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-calendar"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| sed s/\ *=\ */=/g /tmp/kopano/kwebd.cfg > /tmp/kweb-env | ||||
| # always disable tls | ||||
| export tls=no | ||||
| # shellcheck disable=SC2046 | ||||
| export $(grep -v '^#' /tmp/kweb-env | xargs -d '\n') | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| dockerize \ | ||||
| 	-wait file:///etc/machine-id \ | ||||
| 	-wait file:///var/lib/dbus/machine-id | ||||
| 
 | ||||
| # cleaning up env variables | ||||
| unset "${!KCCONF_@}" | ||||
| exec kopano-kwebd serve | ||||
|  | ||||
| @ -1,57 +1,61 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | ||||
| AUTOCONFIGURE=${AUTOCONFIGURE:-true} # when set to false will disable all automatic configuration actions | ||||
| 
 | ||||
| # define default value for serverhostname and serverport if not passed into container | ||||
| KCCONF_SERVERHOSTNAME=${KCCONF_SERVERHOSTNAME:-127.0.0.1} | ||||
| KCCONF_SERVERPORT=${KCCONF_SERVERPORT:-236} | ||||
| ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | ||||
| 
 | ||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | ||||
| [ "$DEBUG" ] && set -x | ||||
| 
 | ||||
| # Hint: this is not compatible with a read-only container. | ||||
| # The general recommendation is to already build a container that has all required packages installed. | ||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 		# shellcheck disable=SC2016 disable=SC2086 | ||||
| 		if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 			apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 		fi | ||||
| 	done | ||||
| else | ||||
| 	echo "Notice: Container is run read-only, skipping package installation." | ||||
| 	echo "If you want to have additional packages installed in the container either:" | ||||
| 	echo "- build your own image with the packages already included" | ||||
| 	echo "- switch the container to 'read_only: false'" | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# Hint: this is not compatible with a read-only container. | ||||
| 	# The general recommendation is to already build a container that has all required packages installed. | ||||
| 	ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| 	if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 			# shellcheck disable=SC2016 disable=SC2086 | ||||
| 			if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 				apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		echo "Notice: Container is run read-only, skipping package installation." | ||||
| 		echo "If you want to have additional packages installed in the container either:" | ||||
| 		echo "- build your own image with the packages already included" | ||||
| 		echo "- switch the container to 'read_only: false'" | ||||
| 	fi | ||||
| 
 | ||||
| 	echo "Ensure directories" | ||||
| 	mkdir -p /run/sessions | ||||
| 
 | ||||
| 	CONFIG_PHP=/tmp/config.php | ||||
| 	# copy latest config template. This should be the mount point for preexisting config files. | ||||
| 	cp /usr/share/kdav/config.php.dist $CONFIG_PHP | ||||
| 
 | ||||
| 	if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 		echo "kDAV is using the default: connection" | ||||
| 	else | ||||
| 		echo "kDAV is using an ip connection" | ||||
| 		sed -e "s#define([\"']MAPI_SERVER[\"'],\s*[\"']default:[\"'])#define('MAPI_SERVER', 'https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano')#" \ | ||||
| 			-i $CONFIG_PHP | ||||
| 	fi | ||||
| 
 | ||||
| 	# change root uri to /kdav | ||||
| 	sed -e "s#define('DAV_ROOT_URI', '/');#define('DAV_ROOT_URI', '/kdav/');#" -i $CONFIG_PHP | ||||
| 
 | ||||
| 	echo "Ensure config ownership" | ||||
| 	chown -R www-data:www-data /run/sessions | ||||
| 
 | ||||
| 	# services need to be aware of the machine-id | ||||
| 	#dockerize \ | ||||
| 	#	-wait file:///etc/machine-id \ | ||||
| 	#	-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| echo "Ensure directories" | ||||
| mkdir -p /run/sessions | ||||
| 
 | ||||
| CONFIG_PHP=/tmp/config.php | ||||
| # copy latest config template. This should be the mount point for preexisting config files. | ||||
| cp /usr/share/kdav/config.php.dist $CONFIG_PHP | ||||
| 
 | ||||
| if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 	echo "kDAV is using the default: connection" | ||||
| else | ||||
| 	echo "kDAV is using an ip connection" | ||||
| 	sed -e "s#define([\"']MAPI_SERVER[\"'],\s*[\"']default:[\"'])#define('MAPI_SERVER', 'https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano')#" \ | ||||
| 		-i $CONFIG_PHP | ||||
| fi | ||||
| 
 | ||||
| # change root uri to /kdav | ||||
| sed -e "s#define('DAV_ROOT_URI', '/');#define('DAV_ROOT_URI', '/kdav/');#" -i $CONFIG_PHP | ||||
| 
 | ||||
| echo "Ensure config ownership" | ||||
| chown -R www-data:www-data /run/sessions | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| #dockerize \ | ||||
| #	-wait file:///etc/machine-id \ | ||||
| #	-wait file:///var/lib/dbus/machine-id | ||||
| 
 | ||||
| touch /var/log/kdav/kdav.log | ||||
| chown www-data:www-data /var/log/kdav/kdav.log | ||||
| tail --pid=$$ -F --lines=0 -q /var/log/kdav/kdav.log & | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| ARG CODE_VERSION=0.33.5 | ||||
| 
 | ||||
| FROM golang:1.13.5-alpine3.10 as builder-sponge | ||||
| FROM golang:1.15-alpine3.12 as builder-sponge | ||||
| 
 | ||||
| RUN apk add --no-cache git | ||||
| RUN go get -d -v github.com/go-moreutils/sponge | ||||
| @ -10,7 +10,9 @@ FROM kopano/konnectd:${CODE_VERSION} | ||||
| 
 | ||||
| ARG CODE_VERSION | ||||
| 
 | ||||
| ENV CODE_VERSION="${CODE_VERSION}" \ | ||||
| ENV \ | ||||
|     AUTOCONFIGURE=true \ | ||||
|     CODE_VERSION="${CODE_VERSION}" \ | ||||
|     DEBUG="" \ | ||||
|     FQDN=localhost \ | ||||
|     KONNECT_BACKEND="kc" \ | ||||
|  | ||||
| @ -11,105 +11,107 @@ if [ $# -gt 0 ]; then | ||||
| 	exit | ||||
| fi | ||||
| 
 | ||||
| signing_private_key=${signing_private_key:-"/etc/kopano/konnectd-signing-private-key.pem"} | ||||
| validation_keys_path=${validation_keys_path:-"/etc/kopano/konnectkeys"} | ||||
| if [ "${AUTOCONFIGURE}" = true ]; then | ||||
| 	signing_private_key=${signing_private_key:-"/etc/kopano/konnectd-signing-private-key.pem"} | ||||
| 	validation_keys_path=${validation_keys_path:-"/etc/kopano/konnectkeys"} | ||||
| 
 | ||||
| if ! true >> "$signing_private_key"; then | ||||
| 	# file can not be created in this container, wait for external creation | ||||
| 	dockerize \ | ||||
| 		-wait file://"$signing_private_key" \ | ||||
| 		-timeout "$DOCKERIZE_TIMEOUT" | ||||
| fi | ||||
| 
 | ||||
| if [ -f "${signing_private_key}" ] && [ ! -s "${signing_private_key}" ]; then | ||||
| 	mkdir -p "${validation_keys_path}" | ||||
| 	rnd=$(RANDFILE=/tmp/.rnd openssl rand -hex 2) | ||||
| 	key="${validation_keys_path}/konnect-$(date +%Y%m%d)-${rnd}.pem" | ||||
| 	>&2	echo "setup: creating new RSA private key at ${key} ..." | ||||
| 	RANDFILE=/tmp/.rnd openssl genpkey -algorithm RSA -out "${key}" -pkeyopt rsa_keygen_bits:4096 -pkeyopt rsa_keygen_pubexp:65537 | ||||
| 	if [ -f "${key}" ]; then | ||||
| 		rm "$signing_private_key" | ||||
| 		ln -sn "${key}" "${signing_private_key}" | ||||
| 	if ! true >> "$signing_private_key"; then | ||||
| 		# file can not be created in this container, wait for external creation | ||||
| 		dockerize \ | ||||
| 			-wait file://"$signing_private_key" \ | ||||
| 			-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 	fi | ||||
| fi | ||||
| 
 | ||||
| encryption_secret_key=${encryption_secret_key:-"/etc/kopano/konnectd-encryption-secret.key"} | ||||
| if ! true >> "$encryption_secret_key"; then | ||||
| 	# file can not be created in this container, wait for external creation | ||||
| 	dockerize \ | ||||
| 		-wait file://"$encryption_secret_key" \ | ||||
| 		-timeout "$DOCKERIZE_TIMEOUT" | ||||
| fi | ||||
| 
 | ||||
| if [ -f "${encryption_secret_key}" ] && [ ! -s "${encryption_secret_key}" ]; then | ||||
| 	>&2	echo "setup: creating new secret key at ${encryption_secret_key} ..." | ||||
| 	RANDFILE=/tmp/.rnd openssl rand -out "${encryption_secret_key}" 32 | ||||
| fi | ||||
| 
 | ||||
| CONFIG_JSON=/tmp/konnectd-identifier-registration.yaml | ||||
| 
 | ||||
| if [ "${allow_client_guests:-}" = "yes" ]; then | ||||
| 	# Create working copy by merging packaged example in /etc/kopano with passed registration conf | ||||
| 	yq -y -s '.[0] + .[1]' /etc/kopano/konnectd-identifier-registration.yaml "${identifier_registration_conf:?}" | sponge "$CONFIG_JSON" | ||||
| 
 | ||||
| 	# only modify identifier registration if it does not already contain the right settings | ||||
| 	if ! yq .clients[].id /kopano/ssl/konnectd-identifier-registration.yaml | grep -q "kpop-https://${FQDN%/*}/meet/"; then | ||||
| 
 | ||||
| 		# TODO this could be simplified so that ecparam and eckey are only required if there is no jwk-meet.json yet | ||||
| 		ecparam=${ecparam:-/etc/kopano/ecparam.pem} | ||||
| 		if ! true >> "$ecparam"; then | ||||
| 			# ecparam can not be created in this container, wait for external creation | ||||
| 			dockerize \ | ||||
| 				-wait file://"$ecparam" \ | ||||
| 				-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 	if [ -f "${signing_private_key}" ] && [ ! -s "${signing_private_key}" ]; then | ||||
| 		mkdir -p "${validation_keys_path}" | ||||
| 		rnd=$(RANDFILE=/tmp/.rnd openssl rand -hex 2) | ||||
| 		key="${validation_keys_path}/konnect-$(date +%Y%m%d)-${rnd}.pem" | ||||
| 		>&2	echo "setup: creating new RSA private key at ${key} ..." | ||||
| 		RANDFILE=/tmp/.rnd openssl genpkey -algorithm RSA -out "${key}" -pkeyopt rsa_keygen_bits:4096 -pkeyopt rsa_keygen_pubexp:65537 | ||||
| 		if [ -f "${key}" ]; then | ||||
| 			rm "$signing_private_key" | ||||
| 			ln -sn "${key}" "${signing_private_key}" | ||||
| 		fi | ||||
| 
 | ||||
| 		eckey=${eckey:-/etc/kopano/meet-kwmserver.pem} | ||||
| 		if ! true >> "$eckey"; then | ||||
| 			# eckey can not be created in this container, wait for external creation | ||||
| 			dockerize \ | ||||
| 				-wait file://"$eckey" \ | ||||
| 				-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 		fi | ||||
| 
 | ||||
| 		# Key generation for Meet guest mode | ||||
| 		if [ ! -s "$ecparam" ]; then | ||||
| 			echo "Creating ec param key for Meet guest mode ..." | ||||
| 			openssl ecparam -name prime256v1 -genkey -noout -out "$ecparam" >/dev/null 2>&1 | ||||
| 		fi | ||||
| 
 | ||||
| 		if [ ! -s "$eckey" ]; then | ||||
| 			echo "Creating ec private key for Meet guest mode..." | ||||
| 			openssl ec -in "$ecparam" -out "$eckey" >/dev/null 2>&1 | ||||
| 		fi | ||||
| 
 | ||||
| 		echo "Entrypoint: Patching identifier registration for use of the Meet guest mode" | ||||
| 		"$EXE" utils jwk-from-pem --use sig "$eckey" > /tmp/jwk-meet.json | ||||
| 		#yq -y ".clients += [{\"id\": \"grapi-explorer.js\", \"name\": \"Grapi Explorer\", \"application_type\": \"web\", \"trusted\": true, \"insecure\": true, \"redirect_uris\": [\"http://$FQDNCLEANED:3000/\"]}]" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 		yq -y ".clients += [{\"id\": \"kpop-https://${FQDN%/*}/meet/\", \"name\": \"Kopano Meet\", \"application_type\": \"web\", \"trusted\": true, \"redirect_uris\": [\"https://${FQDN%/*}/meet/\"], \"trusted_scopes\": [\"konnect/guestok\", \"kopano/kwm\"], \"jwks\": {\"keys\": [{\"kty\": $(jq .kty /tmp/jwk-meet.json), \"use\": $(jq .use /tmp/jwk-meet.json), \"crv\": $(jq .crv /tmp/jwk-meet.json), \"d\": $(jq .d /tmp/jwk-meet.json), \"kid\": $(jq .kid /tmp/jwk-meet.json), \"x\": $(jq .x /tmp/jwk-meet.json), \"y\": $(jq .y /tmp/jwk-meet.json)}]},\"request_object_signing_alg\": \"ES256\"}]" $CONFIG_JSON >> /tmp/guest-mode.yml | ||||
| 		yq -y -s '.[0] + .[1]' $CONFIG_JSON /tmp/guest-mode.yml | sponge "$identifier_registration_conf" | ||||
| 	else | ||||
| 		echo "Entrypoint: Skipping guest mode configuration, as it is already configured." | ||||
| 	fi | ||||
| fi | ||||
| 
 | ||||
| if [ "${external_oidc_provider:-}" = "yes" ]; then | ||||
| 	# Create working copy by merging packaged example in /etc/kopano with passed registration conf | ||||
| 	yq -y -s '.[0] + .[1]' /etc/kopano/konnectd-identifier-registration.yaml "${identifier_registration_conf:?}" | sponge "$CONFIG_JSON" | ||||
| 	encryption_secret_key=${encryption_secret_key:-"/etc/kopano/konnectd-encryption-secret.key"} | ||||
| 	if ! true >> "$encryption_secret_key"; then | ||||
| 		# file can not be created in this container, wait for external creation | ||||
| 		dockerize \ | ||||
| 			-wait file://"$encryption_secret_key" \ | ||||
| 			-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 	fi | ||||
| 
 | ||||
| 	echo "Patching identifier registration for external OIDC provider" | ||||
| 	echo "authorities: [{name: ${external_oidc_name:-}, default: yes, iss: ${external_oidc_url:-}, client_id: ${external_oidc_clientid:-}, client_secret: ${external_oidc_clientsecret:-}, authority_type: oidc, response_type: id_token, scopes: [openid, profile, email], trusted: yes, end_session_enabled: true}]" >> /tmp/authority.yml | ||||
| 	yq -y -s '.[0] + .[1]' $CONFIG_JSON /tmp/authority.yml | sponge "$identifier_registration_conf" | ||||
| 	if [ -f "${encryption_secret_key}" ] && [ ! -s "${encryption_secret_key}" ]; then | ||||
| 		>&2	echo "setup: creating new secret key at ${encryption_secret_key} ..." | ||||
| 		RANDFILE=/tmp/.rnd openssl rand -out "${encryption_secret_key}" 32 | ||||
| 	fi | ||||
| 
 | ||||
| 	echo "Checking if external OIDC provider is reachable" | ||||
| 	dockerize \ | ||||
| 		-wait "$external_oidc_url"/.well-known/openid-configuration \ | ||||
| 		-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 	CONFIG_JSON=/tmp/konnectd-identifier-registration.yaml | ||||
| 
 | ||||
| 	reported_issuer=$(curl -s "$external_oidc_url/.well-known/openid-configuration" | jq -r .issuer) | ||||
| 	if [ -n "${external_oidc_url##$reported_issuer}" ] ;then | ||||
| 		echo "Error: The Issuer does not match the configured url" | ||||
| 		exit 1 | ||||
| 	if [ "${allow_client_guests:-}" = "yes" ]; then | ||||
| 		# Create working copy by merging packaged example in /etc/kopano with passed registration conf | ||||
| 		yq -y -s '.[0] + .[1]' /etc/kopano/konnectd-identifier-registration.yaml "${identifier_registration_conf:?}" | sponge "$CONFIG_JSON" | ||||
| 
 | ||||
| 		# only modify identifier registration if it does not already contain the right settings | ||||
| 		if ! yq .clients[].id /kopano/ssl/konnectd-identifier-registration.yaml | grep -q "kpop-https://${FQDN%/*}/meet/"; then | ||||
| 
 | ||||
| 			# TODO this could be simplified so that ecparam and eckey are only required if there is no jwk-meet.json yet | ||||
| 			ecparam=${ecparam:-/etc/kopano/ecparam.pem} | ||||
| 			if ! true >> "$ecparam"; then | ||||
| 				# ecparam can not be created in this container, wait for external creation | ||||
| 				dockerize \ | ||||
| 					-wait file://"$ecparam" \ | ||||
| 					-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 			fi | ||||
| 
 | ||||
| 			eckey=${eckey:-/etc/kopano/meet-kwmserver.pem} | ||||
| 			if ! true >> "$eckey"; then | ||||
| 				# eckey can not be created in this container, wait for external creation | ||||
| 				dockerize \ | ||||
| 					-wait file://"$eckey" \ | ||||
| 					-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 			fi | ||||
| 
 | ||||
| 			# Key generation for Meet guest mode | ||||
| 			if [ ! -s "$ecparam" ]; then | ||||
| 				echo "Creating ec param key for Meet guest mode ..." | ||||
| 				openssl ecparam -name prime256v1 -genkey -noout -out "$ecparam" >/dev/null 2>&1 | ||||
| 			fi | ||||
| 
 | ||||
| 			if [ ! -s "$eckey" ]; then | ||||
| 				echo "Creating ec private key for Meet guest mode..." | ||||
| 				openssl ec -in "$ecparam" -out "$eckey" >/dev/null 2>&1 | ||||
| 			fi | ||||
| 
 | ||||
| 			echo "Entrypoint: Patching identifier registration for use of the Meet guest mode" | ||||
| 			"$EXE" utils jwk-from-pem --use sig "$eckey" > /tmp/jwk-meet.json | ||||
| 			#yq -y ".clients += [{\"id\": \"grapi-explorer.js\", \"name\": \"Grapi Explorer\", \"application_type\": \"web\", \"trusted\": true, \"insecure\": true, \"redirect_uris\": [\"http://$FQDNCLEANED:3000/\"]}]" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 			yq -y ".clients += [{\"id\": \"kpop-https://${FQDN%/*}/meet/\", \"name\": \"Kopano Meet\", \"application_type\": \"web\", \"trusted\": true, \"redirect_uris\": [\"https://${FQDN%/*}/meet/\"], \"trusted_scopes\": [\"konnect/guestok\", \"kopano/kwm\"], \"jwks\": {\"keys\": [{\"kty\": $(jq .kty /tmp/jwk-meet.json), \"use\": $(jq .use /tmp/jwk-meet.json), \"crv\": $(jq .crv /tmp/jwk-meet.json), \"d\": $(jq .d /tmp/jwk-meet.json), \"kid\": $(jq .kid /tmp/jwk-meet.json), \"x\": $(jq .x /tmp/jwk-meet.json), \"y\": $(jq .y /tmp/jwk-meet.json)}]},\"request_object_signing_alg\": \"ES256\"}]" $CONFIG_JSON >> /tmp/guest-mode.yml | ||||
| 			yq -y -s '.[0] + .[1]' $CONFIG_JSON /tmp/guest-mode.yml | sponge "$identifier_registration_conf" | ||||
| 		else | ||||
| 			echo "Entrypoint: Skipping guest mode configuration, as it is already configured." | ||||
| 		fi | ||||
| 	fi | ||||
| 
 | ||||
| 	if [ "${external_oidc_provider:-}" = "yes" ]; then | ||||
| 		# Create working copy by merging packaged example in /etc/kopano with passed registration conf | ||||
| 		yq -y -s '.[0] + .[1]' /etc/kopano/konnectd-identifier-registration.yaml "${identifier_registration_conf:?}" | sponge "$CONFIG_JSON" | ||||
| 
 | ||||
| 		echo "Patching identifier registration for external OIDC provider" | ||||
| 		echo "authorities: [{name: ${external_oidc_name:-}, default: yes, iss: ${external_oidc_url:-}, client_id: ${external_oidc_clientid:-}, client_secret: ${external_oidc_clientsecret:-}, authority_type: oidc, response_type: id_token, scopes: [openid, profile, email], trusted: yes, end_session_enabled: true}]" >> /tmp/authority.yml | ||||
| 		yq -y -s '.[0] + .[1]' $CONFIG_JSON /tmp/authority.yml | sponge "$identifier_registration_conf" | ||||
| 
 | ||||
| 		echo "Checking if external OIDC provider is reachable" | ||||
| 		dockerize \ | ||||
| 			-wait "$external_oidc_url"/.well-known/openid-configuration \ | ||||
| 			-timeout "$DOCKERIZE_TIMEOUT" | ||||
| 
 | ||||
| 		reported_issuer=$(curl -s "$external_oidc_url/.well-known/openid-configuration" | jq -r .issuer) | ||||
| 		if [ -n "${external_oidc_url##$reported_issuer}" ] ;then | ||||
| 			echo "Error: The Issuer does not match the configured url" | ||||
| 			exit 1 | ||||
| 		fi | ||||
| 	fi | ||||
| fi | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,9 @@ ARG CODE_VERSION=0.1.0 | ||||
| FROM kopano/kwmbridged:${CODE_VERSION} | ||||
| 
 | ||||
| ARG CODE_VERSION | ||||
| ENV CODE_VERSION="${CODE_VERSION}" | ||||
| ENV \ | ||||
|     AUTOCONFIGURE=true \ | ||||
|     CODE_VERSION="${CODE_VERSION}" | ||||
| 
 | ||||
| LABEL maintainer=az@zok.xyz \ | ||||
|     org.label-schema.name="Kopano Kwmbridge container" \ | ||||
|  | ||||
| @ -45,21 +45,23 @@ if [ "$INSECURE" = "yes" ]; then | ||||
| 	set -- "$@" --insecure | ||||
| fi | ||||
| 
 | ||||
| if [ "$INSECURE" = "yes" ]; then | ||||
| 	dockerize \ | ||||
| 	-skip-tls-verify \ | ||||
| 	-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 	-timeout 360s | ||||
| else | ||||
| 	dockerize \ | ||||
| 	-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 	-timeout 360s | ||||
| fi | ||||
| if [ "${AUTOCONFIGURE}" = true ]; then | ||||
| 	if [ "$INSECURE" = "yes" ]; then | ||||
| 		dockerize \ | ||||
| 		-skip-tls-verify \ | ||||
| 		-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	else | ||||
| 		dockerize \ | ||||
| 		-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	fi | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| dockerize \ | ||||
| 	-wait file:///etc/machine-id \ | ||||
| 	-wait file:///var/lib/dbus/machine-id | ||||
| 	# services need to be aware of the machine-id | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| exec kwmbridged serve \ | ||||
| 	"$@" | ||||
|  | ||||
| @ -2,7 +2,9 @@ ARG CODE_VERSION=1.2.0 | ||||
| FROM kopano/kwmserverd:${CODE_VERSION} | ||||
| 
 | ||||
| ARG CODE_VERSION | ||||
| ENV CODE_VERSION="${CODE_VERSION}" | ||||
| ENV \ | ||||
|     AUTOCONFIGURE=true \ | ||||
|     CODE_VERSION="${CODE_VERSION}" | ||||
| 
 | ||||
| LABEL maintainer=az@zok.xyz \ | ||||
|     org.label-schema.name="Kopano Kwmserver container" \ | ||||
|  | ||||
| @ -68,21 +68,23 @@ if [ -n "${public_guest_access_regexp:-}" ]; then | ||||
| 	set -- "$@" --public-guest-access-regexp="$public_guest_access_regexp" | ||||
| fi | ||||
| 
 | ||||
| if [ "$INSECURE" = "yes" ]; then | ||||
| 	dockerize \ | ||||
| 	-skip-tls-verify \ | ||||
| 	-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 	-timeout 360s | ||||
| else | ||||
| 	dockerize \ | ||||
| 	-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 	-timeout 360s | ||||
| fi | ||||
| if [ "${AUTOCONFIGURE}" = true ]; then | ||||
| 	if [ "$INSECURE" = "yes" ]; then | ||||
| 		dockerize \ | ||||
| 		-skip-tls-verify \ | ||||
| 		-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	else | ||||
| 		dockerize \ | ||||
| 		-wait "$oidc_issuer_identifier"/.well-known/openid-configuration \ | ||||
| 		-timeout 360s | ||||
| 	fi | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| dockerize \ | ||||
| 	-wait file:///etc/machine-id \ | ||||
| 	-wait file:///var/lib/dbus/machine-id | ||||
| 	# services need to be aware of the machine-id | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| registration_conf=${registration_conf:-/etc/kopano/kwmserverd-registration.yaml} | ||||
| 
 | ||||
|  | ||||
| @ -5,12 +5,14 @@ ADDITIONAL_KOPANO_PACKAGES=${ADDITIONAL_KOPANO_PACKAGES:-""} | ||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | ||||
| [ "$DEBUG" ] && set -x | ||||
| 
 | ||||
| # copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||
| mkdir -p /tmp/kopano | ||||
| cp /etc/kopano/*.cfg /tmp/kopano | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# copy configuration files to /tmp/kopano to prevent modification of mounted config files | ||||
| 	mkdir -p /tmp/kopano | ||||
| 	cp /etc/kopano/*.cfg /tmp/kopano | ||||
| 
 | ||||
| echo "Applying cfg changes from env" | ||||
| /usr/bin/python3 /kopano/cfg-from-env.py | ||||
| 	echo "Applying cfg changes from env" | ||||
| 	/usr/bin/python3 /kopano/cfg-from-env.py | ||||
| fi | ||||
| 
 | ||||
| meetversion=$(dpkg-query --showformat='${Version}' --show kopano-meet-webapp) | ||||
| echo "Using Kopano Meet: $meetversion" | ||||
| @ -21,55 +23,57 @@ if [ $# -gt 0 ]; then | ||||
| 	exit | ||||
| fi | ||||
| 
 | ||||
| cp /usr/share/doc/kopano-meet-webapp/config.json.in /tmp/meet.json | ||||
| CONFIG_JSON="/tmp/meet.json" | ||||
| echo "Updating $CONFIG_JSON" | ||||
| for setting in $(compgen -A variable KCCONF_MEET); do | ||||
| 	setting2=${setting#KCCONF_MEET_} | ||||
| 	# dots in setting2 need to be escaped to not be handled as separate entities in the json file | ||||
| 	case ${!setting} in | ||||
| 		true|TRUE|false|FALSE|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) | ||||
| 			jq ".\"${setting2//_/\".\"}\" = ${!setting}" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 			;; | ||||
| 		*) | ||||
| 			jq ".\"${setting2//_/\".\"}\" = \"${!setting}\"" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 			;; | ||||
| 		esac | ||||
| done | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	cp /usr/share/doc/kopano-meet-webapp/config.json.in /tmp/meet.json | ||||
| 	CONFIG_JSON="/tmp/meet.json" | ||||
| 	echo "Updating $CONFIG_JSON" | ||||
| 	for setting in $(compgen -A variable KCCONF_MEET); do | ||||
| 		setting2=${setting#KCCONF_MEET_} | ||||
| 		# dots in setting2 need to be escaped to not be handled as separate entities in the json file | ||||
| 		case ${!setting} in | ||||
| 			true|TRUE|false|FALSE|[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) | ||||
| 				jq ".\"${setting2//_/\".\"}\" = ${!setting}" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 				;; | ||||
| 			*) | ||||
| 				jq ".\"${setting2//_/\".\"}\" = \"${!setting}\"" $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 				;; | ||||
| 			esac | ||||
| 	done | ||||
| 
 | ||||
| # Populate app grid | ||||
| # Note: if below variables are set to "no" kpop will fall back to its default behaviour and show all known apps. | ||||
| # enable Kopano Konnect in the app grid | ||||
| if [ "${GRID_KONNECT:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-konnect"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	# Populate app grid | ||||
| 	# Note: if below variables are set to "no" kpop will fall back to its default behaviour and show all known apps. | ||||
| 	# enable Kopano Konnect in the app grid | ||||
| 	if [ "${GRID_KONNECT:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-konnect"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano Meet in the app grid | ||||
| 	if [ "${GRID_MEET:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-meet"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano WebApp in the app grid | ||||
| 	if [ "${GRID_WEBAPP:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	# enable Kopano WebApp in the app grid | ||||
| 	if [ "${GRID_CALENDAR:-yes}" = "yes" ]; then | ||||
| 		jq '.apps.enabled += ["kopano-calendar"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| 	fi | ||||
| 
 | ||||
| 	sed s/\ *=\ */=/g /tmp/kopano/kwebd.cfg > /tmp/kweb-env | ||||
| 	# always disable tls | ||||
| 	export tls=no | ||||
| 	# shellcheck disable=SC2046 | ||||
| 	export $(grep -v '^#' /tmp/kweb-env | xargs -d '\n') | ||||
| 
 | ||||
| 	# services need to be aware of the machine-id | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano Meet in the app grid | ||||
| if [ "${GRID_MEET:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-meet"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano WebApp in the app grid | ||||
| if [ "${GRID_WEBAPP:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-webapp"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| # enable Kopano WebApp in the app grid | ||||
| if [ "${GRID_CALENDAR:-yes}" = "yes" ]; then | ||||
| 	jq '.apps.enabled += ["kopano-calendar"]' $CONFIG_JSON | sponge $CONFIG_JSON | ||||
| fi | ||||
| 
 | ||||
| sed s/\ *=\ */=/g /tmp/kopano/kwebd.cfg > /tmp/kweb-env | ||||
| # always disable tls | ||||
| export tls=no | ||||
| # shellcheck disable=SC2046 | ||||
| export $(grep -v '^#' /tmp/kweb-env | xargs -d '\n') | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| dockerize \ | ||||
| 	-wait file:///etc/machine-id \ | ||||
| 	-wait file:///var/lib/dbus/machine-id | ||||
| 
 | ||||
| # cleaning up env variables | ||||
| unset "${!KCCONF_@}" | ||||
| exec kopano-kwebd serve | ||||
|  | ||||
| @ -12,7 +12,7 @@ LABEL maintainer=az@zok.xyz \ | ||||
|     org.label-schema.schema-version="1.0" | ||||
| 
 | ||||
| ENV \ | ||||
|     AUTOCONFIG=yes \ | ||||
|     AUTOCONFIGURE=true \ | ||||
|     CODE_VERSION="${CODE_VERSION}" \ | ||||
|     DEFAULTREDIRECT="/webapp" \ | ||||
|     KONNECTPATH=kopanoid \ | ||||
|  | ||||
| @ -11,7 +11,7 @@ fi | ||||
| export CADDYPATH="$KOPANO_KWEB_ASSETS_PATH" | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| if [ "$AUTOCONFIG" = "yes" ]; then | ||||
| if [ "$AUTOCONFIGURE" = true ]; then | ||||
| 	dockerize \ | ||||
| 		-wait file:///etc/machine-id \ | ||||
| 		-wait file:///var/lib/dbus/machine-id | ||||
|  | ||||
							
								
								
									
										132
									
								
								webapp/start.sh
									
									
									
									
									
								
							
							
						
						
									
										132
									
								
								webapp/start.sh
									
									
									
									
									
								
							| @ -9,75 +9,77 @@ ADDITIONAL_KOPANO_WEBAPP_PLUGINS=${ADDITIONAL_KOPANO_WEBAPP_PLUGINS:-""} | ||||
| set -eu # unset variables are errors & non-zero return values exit the whole script | ||||
| [ "$DEBUG" ] && set -x | ||||
| 
 | ||||
| # shellcheck source=php/start-helper.sh | ||||
| source /kopano/start-helper.sh | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# shellcheck source=php/start-helper.sh | ||||
| 	source /kopano/start-helper.sh | ||||
| 
 | ||||
| # Hint: this is not compatible with a read-only container. | ||||
| # The general recommendation is to already build a container that has all required packages installed. | ||||
| ADDITIONAL_KOPANO_PACKAGES="$ADDITIONAL_KOPANO_PACKAGES $ADDITIONAL_KOPANO_WEBAPP_PLUGINS" | ||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 		# shellcheck disable=SC2016 disable=SC2086 | ||||
| 		if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 			DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 		else | ||||
| 			echo "INFO: $installpkg is already installed" | ||||
| 		fi | ||||
| 	# Hint: this is not compatible with a read-only container. | ||||
| 	# The general recommendation is to already build a container that has all required packages installed. | ||||
| 	ADDITIONAL_KOPANO_PACKAGES="$ADDITIONAL_KOPANO_PACKAGES $ADDITIONAL_KOPANO_WEBAPP_PLUGINS" | ||||
| 	ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| 	if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 			# shellcheck disable=SC2016 disable=SC2086 | ||||
| 			if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 				DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 			else | ||||
| 				echo "INFO: $installpkg is already installed" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		echo "Notice: Container is run read-only, skipping package installation." | ||||
| 		echo "If you want to have additional packages installed in the container either:" | ||||
| 		echo "- build your own image with the packages already included" | ||||
| 		echo "- switch the container to 'read_only: false'" | ||||
| 	fi | ||||
| 
 | ||||
| 	# copy latest config template | ||||
| 	mkdir -p /tmp/webapp/ | ||||
| 	for i in /etc/kopano/webapp/*.dist /etc/kopano/webapp/.[^.]*.dist; do | ||||
| 		filename=$(basename -- "$i") | ||||
| 		cp "$i" "/tmp/webapp/${filename%.*}" | ||||
| 	done | ||||
| else | ||||
| 	echo "Notice: Container is run read-only, skipping package installation." | ||||
| 	echo "If you want to have additional packages installed in the container either:" | ||||
| 	echo "- build your own image with the packages already included" | ||||
| 	echo "- switch the container to 'read_only: false'" | ||||
| 
 | ||||
| 	# Ensure directories exist | ||||
| 	mkdir -p /run/sessions /tmp/webapp /var/lib/kopano-webapp/tmp | ||||
| 
 | ||||
| 	phpversion=$(dpkg-query --showformat='${Version}' --show php7-mapi) | ||||
| 	echo "Using PHP-Mapi: $phpversion" | ||||
| 	webappversion=$(dpkg-query --showformat='${Version}' --show kopano-webapp) | ||||
| 	echo "Using Kopano WebApp: $webappversion" | ||||
| 
 | ||||
| 	if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 		echo "Kopano WebApp is using the default: connection" | ||||
| 	else | ||||
| 		echo "Kopano WebApp is using an ip connection" | ||||
| 		php_cfg_gen /tmp/webapp/config.php DEFAULT_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||
| 	fi | ||||
| 
 | ||||
| 	# configuring webapp from env | ||||
| 	for setting in $(compgen -A variable KCCONF_WEBAPP_); do | ||||
| 		setting2=${setting#KCCONF_WEBAPP_} | ||||
| 		php_cfg_gen /tmp/webapp/config.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring webapp plugins from env | ||||
| 	for setting in $(compgen -A variable KCCONF_WEBAPPPLUGIN_); do | ||||
| 		setting2=${setting#KCCONF_WEBAPPPLUGIN_} | ||||
| 		filename="${setting2%%_*}" | ||||
| 		setting3=${setting#KCCONF_WEBAPPPLUGIN_${filename}_} | ||||
| 		identifier="${filename,,}" | ||||
| 		php_cfg_gen /tmp/webapp/config-"$identifier".php "${setting3}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	echo "Ensure config ownership" | ||||
| 	chown -R www-data:www-data /run/sessions /tmp/webapp /var/lib/kopano-webapp/tmp | ||||
| 
 | ||||
| 	# services need to be aware of the machine-id | ||||
| 	#dockerize \ | ||||
| 	#	-wait file:///etc/machine-id \ | ||||
| 	#	-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| # copy latest config template | ||||
| mkdir -p /tmp/webapp/ | ||||
| for i in /etc/kopano/webapp/*.dist /etc/kopano/webapp/.[^.]*.dist; do | ||||
| 	filename=$(basename -- "$i") | ||||
| 	cp "$i" "/tmp/webapp/${filename%.*}" | ||||
| done | ||||
| 
 | ||||
| # Ensure directories exist | ||||
| mkdir -p /run/sessions /tmp/webapp /var/lib/kopano-webapp/tmp | ||||
| 
 | ||||
| phpversion=$(dpkg-query --showformat='${Version}' --show php7-mapi) | ||||
| echo "Using PHP-Mapi: $phpversion" | ||||
| webappversion=$(dpkg-query --showformat='${Version}' --show kopano-webapp) | ||||
| echo "Using Kopano WebApp: $webappversion" | ||||
| 
 | ||||
| if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 	echo "Kopano WebApp is using the default: connection" | ||||
| else | ||||
| 	echo "Kopano WebApp is using an ip connection" | ||||
| 	php_cfg_gen /tmp/webapp/config.php DEFAULT_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||
| fi | ||||
| 
 | ||||
| # configuring webapp from env | ||||
| for setting in $(compgen -A variable KCCONF_WEBAPP_); do | ||||
| 	setting2=${setting#KCCONF_WEBAPP_} | ||||
| 	php_cfg_gen /tmp/webapp/config.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring webapp plugins from env | ||||
| for setting in $(compgen -A variable KCCONF_WEBAPPPLUGIN_); do | ||||
| 	setting2=${setting#KCCONF_WEBAPPPLUGIN_} | ||||
| 	filename="${setting2%%_*}" | ||||
| 	setting3=${setting#KCCONF_WEBAPPPLUGIN_${filename}_} | ||||
| 	identifier="${filename,,}" | ||||
| 	php_cfg_gen /tmp/webapp/config-"$identifier".php "${setting3}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| echo "Ensure config ownership" | ||||
| chown -R www-data:www-data /run/sessions /tmp/webapp /var/lib/kopano-webapp/tmp | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| #dockerize \ | ||||
| #	-wait file:///etc/machine-id \ | ||||
| #	-wait file:///var/lib/dbus/machine-id | ||||
| 
 | ||||
| set +u | ||||
| # cleaning up env variables | ||||
| unset "${!KCCONF_@}" | ||||
|  | ||||
| @ -1,8 +0,0 @@ | ||||
| <VirtualHost *:80> | ||||
| 	DocumentRoot /var/www/ | ||||
| 
 | ||||
| 	LogFormat "%{X-Forwarded-For}i %{%a %b %d %T %Y}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy | ||||
| 	ErrorLog "|/bin/cat" | ||||
| 	CustomLog "|/bin/cat" proxy | ||||
| 
 | ||||
| </VirtualHost> | ||||
							
								
								
									
										196
									
								
								zpush/start.sh
									
									
									
									
									
								
							
							
						
						
									
										196
									
								
								zpush/start.sh
									
									
									
									
									
								
							| @ -39,106 +39,108 @@ php_cfg_gen() { | ||||
| 	fi | ||||
| } | ||||
| 
 | ||||
| # Hint: this is not compatible with a read-only container. | ||||
| # The general recommendation is to already build a container that has all required packages installed. | ||||
| ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 	[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 		# shellcheck disable=SC2016 disable=SC2086 | ||||
| 		if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 			DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 		else | ||||
| 			echo "INFO: $installpkg is already installed" | ||||
| 		fi | ||||
| if [ "${AUTOCONFIGURE}" == true ]; then | ||||
| 	# Hint: this is not compatible with a read-only container. | ||||
| 	# The general recommendation is to already build a container that has all required packages installed. | ||||
| 	ADDITIONAL_KOPANO_PACKAGES=$(echo "$ADDITIONAL_KOPANO_PACKAGES" | tr -d '"') | ||||
| 	if [ -n "$(mkdir -p "/var/lib/apt/lists/" 2&> /dev/null)" ]; then | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && apt update | ||||
| 		[ -n "${ADDITIONAL_KOPANO_PACKAGES// }" ] && for installpkg in $ADDITIONAL_KOPANO_PACKAGES; do | ||||
| 			# shellcheck disable=SC2016 disable=SC2086 | ||||
| 			if [ "$(dpkg-query -W -f='${Status}' $installpkg 2>/dev/null | grep -c 'ok installed')" -eq 0 ]; then | ||||
| 				DEBIAN_FRONTEND=noninteractive apt --assume-yes --no-upgrade install "$installpkg" | ||||
| 			else | ||||
| 				echo "INFO: $installpkg is already installed" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		echo "Notice: Container is run read-only, skipping package installation." | ||||
| 		echo "If you want to have additional packages installed in the container either:" | ||||
| 		echo "- build your own image with the packages already included" | ||||
| 		echo "- switch the container to 'read_only: false'" | ||||
| 	fi | ||||
| 
 | ||||
| 	# copy latest config template | ||||
| 	mkdir -p /tmp/z-push/ | ||||
| 	for i in /etc/z-push/*.dist; do | ||||
| 		filename=$(basename -- "$i") | ||||
| 		cp "$i" "/tmp/z-push/${filename%.*}" | ||||
| 	done | ||||
| else | ||||
| 	echo "Notice: Container is run read-only, skipping package installation." | ||||
| 	echo "If you want to have additional packages installed in the container either:" | ||||
| 	echo "- build your own image with the packages already included" | ||||
| 	echo "- switch the container to 'read_only: false'" | ||||
| 
 | ||||
| 	# Ensure directories | ||||
| 	mkdir -p /run/sessions | ||||
| 
 | ||||
| 	phpversion=$(dpkg-query --showformat='${Version}' --show php7-mapi) | ||||
| 	echo "Using PHP-Mapi: $phpversion" | ||||
| 	zpushversion=$(dpkg-query --showformat='${Version}' --show z-push-kopano) | ||||
| 	echo "Using Z-Push: $zpushversion" | ||||
| 
 | ||||
| 	if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 		echo "Z-Push is using the default: connection" | ||||
| 	else | ||||
| 		echo "Z-Push is using an ip connection" | ||||
| 		php_cfg_gen /tmp/z-push/kopano.conf.php MAPI_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||
| 	fi | ||||
| 
 | ||||
| 	echo "Configuring Z-Push for use behind a reverse proxy" | ||||
| 	php_cfg_gen /tmp/z-push/z-push.conf.php USE_CUSTOM_REMOTE_IP_HEADER HTTP_X_FORWARDED_FOR | ||||
| 
 | ||||
| 	# configuring z-push from env | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSH_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSH_} | ||||
| 		php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring autodiscover | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSHAUTODISCOVER_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSHAUTODISCOVER_} | ||||
| 		php_cfg_gen /tmp/z-push/autodiscover.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring z-push gabsync | ||||
| 	php_cfg_gen /tmp/z-push/gabsync.conf.php USERNAME SYSTEM | ||||
| 
 | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSHGABSYNC_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSHGAVSYNC_} | ||||
| 		php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring z-push sql state engine | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSHSQL_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSHSQL_} | ||||
| 		php_cfg_gen /tmp/z-push/state-sql.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring z-push memcached | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSHMEMCACHED_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSHMEMCACHED_} | ||||
| 		php_cfg_gen /tmp/z-push/memcached.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring z-push gab2contacts | ||||
| 	for setting in $(compgen -A variable KCCONF_ZPUSHGA2CONTACTS_); do | ||||
| 		setting2=${setting#KCCONF_ZPUSHSQL_} | ||||
| 		php_cfg_gen /tmp/z-push/gab2contacts.conf.php "${setting2}" "${!setting}" | ||||
| 	done | ||||
| 
 | ||||
| 	# configuring z-push shared folders | ||||
| 	perl -i -0pe 's/\$additionalFolders.*\);//s' /tmp/z-push/z-push.conf.php | ||||
| 	echo -e "  \$additionalFolders = array(" >> /tmp/z-push/z-push.conf.php | ||||
| 	echo "$ZPUSH_ADDITIONAL_FOLDERS" | jq -c '.[]' | while read -r folder; do | ||||
| 		eval "$(echo "$folder" | jq -r '@sh "NAME=\(.name) ID=\(.id) TYPE=\(.type) FLAGS=\(.flags)"')" | ||||
| 		echo -e "    array('store' => \"SYSTEM\", 'folderid' => \"$ID\", 'name' => \"$NAME\", 'type' => $TYPE, 'flags' => $FLAGS)," >> /etc/z-push/z-push.conf.php | ||||
| 	done | ||||
| 	echo -e '  );' >> /tmp/z-push/z-push.conf.php | ||||
| 
 | ||||
| 	echo "Ensure config ownership" | ||||
| 	chown -R www-data:www-data /run/sessions | ||||
| 
 | ||||
| 	# services need to be aware of the machine-id | ||||
| 	#dockerize \ | ||||
| 	#	-wait file:///etc/machine-id \ | ||||
| 	#	-wait file:///var/lib/dbus/machine-id | ||||
| fi | ||||
| 
 | ||||
| # copy latest config template | ||||
| mkdir -p /tmp/z-push/ | ||||
| for i in /etc/z-push/*.dist; do | ||||
| 	filename=$(basename -- "$i") | ||||
| 	cp "$i" "/tmp/z-push/${filename%.*}" | ||||
| done | ||||
| 
 | ||||
| # Ensure directories | ||||
| mkdir -p /run/sessions | ||||
| 
 | ||||
| phpversion=$(dpkg-query --showformat='${Version}' --show php7-mapi) | ||||
| echo "Using PHP-Mapi: $phpversion" | ||||
| zpushversion=$(dpkg-query --showformat='${Version}' --show z-push-kopano) | ||||
| echo "Using Z-Push: $zpushversion" | ||||
| 
 | ||||
| if [ "$KCCONF_SERVERHOSTNAME" == "127.0.0.1" ]; then | ||||
| 	echo "Z-Push is using the default: connection" | ||||
| else | ||||
| 	echo "Z-Push is using an ip connection" | ||||
| 	php_cfg_gen /tmp/z-push/kopano.conf.php MAPI_SERVER "https://${KCCONF_SERVERHOSTNAME}:${KCCONF_SERVERPORT}/kopano" | ||||
| fi | ||||
| 
 | ||||
| echo "Configuring Z-Push for use behind a reverse proxy" | ||||
| php_cfg_gen /tmp/z-push/z-push.conf.php USE_CUSTOM_REMOTE_IP_HEADER HTTP_X_FORWARDED_FOR | ||||
| 
 | ||||
| # configuring z-push from env | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSH_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSH_} | ||||
| 	php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring autodiscover | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSHAUTODISCOVER_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSHAUTODISCOVER_} | ||||
| 	php_cfg_gen /tmp/z-push/autodiscover.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring z-push gabsync | ||||
| php_cfg_gen /tmp/z-push/gabsync.conf.php USERNAME SYSTEM | ||||
| 
 | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSHGABSYNC_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSHGAVSYNC_} | ||||
| 	php_cfg_gen /tmp/z-push/z-push.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring z-push sql state engine | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSHSQL_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSHSQL_} | ||||
| 	php_cfg_gen /tmp/z-push/state-sql.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring z-push memcached | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSHMEMCACHED_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSHMEMCACHED_} | ||||
| 	php_cfg_gen /tmp/z-push/memcached.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring z-push gab2contacts | ||||
| for setting in $(compgen -A variable KCCONF_ZPUSHGA2CONTACTS_); do | ||||
| 	setting2=${setting#KCCONF_ZPUSHSQL_} | ||||
| 	php_cfg_gen /tmp/z-push/gab2contacts.conf.php "${setting2}" "${!setting}" | ||||
| done | ||||
| 
 | ||||
| # configuring z-push shared folders | ||||
| perl -i -0pe 's/\$additionalFolders.*\);//s' /tmp/z-push/z-push.conf.php | ||||
| echo -e "  \$additionalFolders = array(" >> /tmp/z-push/z-push.conf.php | ||||
| echo "$ZPUSH_ADDITIONAL_FOLDERS" | jq -c '.[]' | while read -r folder; do | ||||
| 	eval "$(echo "$folder" | jq -r '@sh "NAME=\(.name) ID=\(.id) TYPE=\(.type) FLAGS=\(.flags)"')" | ||||
| 	echo -e "    array('store' => \"SYSTEM\", 'folderid' => \"$ID\", 'name' => \"$NAME\", 'type' => $TYPE, 'flags' => $FLAGS)," >> /etc/z-push/z-push.conf.php | ||||
| done | ||||
| echo -e '  );' >> /tmp/z-push/z-push.conf.php | ||||
| 
 | ||||
| echo "Ensure config ownership" | ||||
| chown -R www-data:www-data /run/sessions | ||||
| 
 | ||||
| # services need to be aware of the machine-id | ||||
| #dockerize \ | ||||
| #	-wait file:///etc/machine-id \ | ||||
| #	-wait file:///var/lib/dbus/machine-id | ||||
| 
 | ||||
| echo "Activate z-push log rerouting" | ||||
| mkdir -p /var/log/z-push/ | ||||
| touch /var/log/z-push/{z-push.log,z-push-error.log,autodiscover.log,autodiscover-error.log} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user