bachelorthesis/Implementierung/alpine-haraka-gateway/docker-entrypoint.sh

132 lines
4.0 KiB
Bash

#!/bin/sh
#
# a wrapper script for the Haraka server process. when invoked with
# 'haraka' as first argument, it performs two additional steps:
# * ensure proper ownership and permissions of the persistence directories
# * capture the log statements from stdout and writes it to /logs
#
# all other arguments are passed through to the sub-command.
#
# the ownership and permissions flags is required, as docker maintains
# the settings from the host once a volume is mounted. the userid will
# most likely not match and the default bits of 0755 will prevent Haraka
# to write any data. the permission flags can be defined via the
# environment variable DOCKER_VOLUMES_CHMOD and the ownership via
# DOCKER_VOLUMES_CHOWN. if a variable is not defined, its respective
# action is not performed and the volume directories remain unchanged.
#
# logging to file is supported by Haraka, but only in daemon mode. this
# would cause the container to exit immediately. the SMTP server is
# therefor run in the forground, which causes log messages to end up
# in stdout. the wrapper script redirects it to files in /logs. in order
# to preserve log files from previous runs, a new logfile is created,
# together with a symlink pointing to the current file. the name of the
# log file can be configured via the environment variable
# HARAKA_LOG_DATE_FORMAT. its content is expected to be a valid
# date (1) format pattern.
#
set -e
HARAKA_LOG="haraka-latest.log"
HARAKA_BIN="haraka"
# create a new log file and a symbolic link named 'haraka.log'
# to that file in the same directory. the symbolic link is
# overwritten if it exists.
# @param $1 {String} log filename (without directory path)
haraka_log_rotate() {
# remove symlink in case of persistent mount
test -e "$HARAKA_LOGS/haraka.log" && rm -f "$HARAKA_LOGS/haraka.log"
touch "$HARAKA_LOGS/$1" && ln -s "$HARAKA_LOGS/$1" "$HARAKA_LOGS/haraka.log"
}
# change the ownership of the haraka persistence volumes.
# @param $1 {String} chown ownership rule
haraka_chown() {
chown -R "$1" "$HARAKA_LOGS" && \
chown -R "$1" "$HARAKA_DATA"
}
# change the permission flags of the haraka persistence volumes.
# @param $1 {String} chmod permission flags
haraka_chmod() {
chmod "$1" "$HARAKA_LOGS" && \
chmod "$1" "$HARAKA_DATA"
}
# set the filename of the log output. if the environment variable
# 'HARAKA_LOG_DATE_FORMAT' is set, it is used to generate the filename
# postfix using the 'date' command. the default is to use 'date +%s' as
# the filename postfix.
configure_log_filename() {
HARAKA_LOG_IDENT=$(date +"${HARAKA_LOG_DATE_FORMAT:-s}")
HARAKA_LOG="haraka-${HARAKA_LOG_IDENT}.log"
}
# perform pre-boot actions before the SMTP server starts.
haraka_bootstrap() {
configure_log_filename
haraka_log_rotate "$HARAKA_LOG"
if test "x$DOCKER_VOLUMES_CHOWN" != "x";then
haraka_chown "$DOCKER_VOLUMES_CHOWN" || return 1
fi
if test "x$DOCKER_VOLUMES_CHMOD" != "x";then
haraka_chmod "$DOCKER_VOLUMES_CHMOD" || return 1
fi
return 0
}
# ensure the environment has been set up correctly.
# @return {Number} a value greater than zero if anything is not OK
validate_haraka_env() {
if test "x$HARAKA_LOGS" = "x";then
echo "Haraka logs directory has not been set." 1>&2
return 1
fi
if test "x$HARAKA_DATA" = "x";then
echo "Haraka data directory has not been set." 1>&2
return 1
fi
return 0
}
exec_haraka() {
validate_haraka_env || exit 1
haraka_bootstrap || exit 2
# tee outout so 'docker logs' and 'tail -f $LOG_VOLUME/haraka.log' works
exec "$HARAKA_BIN" -c /app "$@" 2>&1 | tee "$HARAKA_LOGS/$HARAKA_LOG"
}
exec_help() {
echo "Either run this command without any parameters to execute"
echo "Haraka or specify the command which should be invoked."
exit 0
}
# script entry point
main() {
case "${1:-haraka}" in
[hH]araka)
exec_haraka
;;
--help|-h|-?)
exec_help
;;
*)
exec "$@"
;;
esac
}
main "$@"