132 lines
4.0 KiB
Bash
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 "$@"
|