scripts: merge new setup.sh version for 10.2.0 again (#2189)

This commit is contained in:
Georg Lauterbach 2021-09-19 16:47:08 +02:00 committed by GitHub
parent 4db546d300
commit 3216d495cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 117 additions and 527 deletions

View file

@ -78,7 +78,7 @@ All workflows are using the tagging convention listed below. It is subsequently
Since Docker Mailserver `v10.2.0`, `setup.sh` functionality is included within the Docker image. The external convenience script is no longer required if you prefer using `docker exec <CONTAINER NAME> setup <COMMAND>` instead. Since Docker Mailserver `v10.2.0`, `setup.sh` functionality is included within the Docker image. The external convenience script is no longer required if you prefer using `docker exec <CONTAINER NAME> setup <COMMAND>` instead.
> **Note:** If you're using Docker or Docker Compose and are new to Docker Mailserver, it is recommended to use the script `setup.sh` for convenience. **Note:** If you're using Docker or Docker Compose and are new to Docker Mailserver, it is recommended to use the script `setup.sh` for convenience.
``` BASH ``` BASH
DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master' DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
@ -92,7 +92,9 @@ chmod a+x ./setup.sh
If no `docker-mailserver` container is running, any `./setup.sh` command will check online for the `:latest` image tag (the current stable release), performing a `pull` if necessary followed by running the command in a temporary container. If no `docker-mailserver` container is running, any `./setup.sh` command will check online for the `:latest` image tag (the current stable release), performing a `pull` if necessary followed by running the command in a temporary container.
**NOTE** _If you're using Docker Mailserver version `v10.1.x` or below_, you will need to get `setup.sh` with a specific version. Substitute `<VERSION>` with the mail server version you're using: `wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/<VERSION>/setup.sh`. #### `setup.sh` for Docker Mailserver version `v10.1.x` and below
If you're using Docker Mailserver version `v10.1.x` or below, you will need to get `setup.sh` with a specific version. Substitute `<VERSION>` with the mail server version you're using: `wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/<VERSION>/setup.sh`.
### Create a docker-compose environment ### Create a docker-compose environment

View file

@ -13,6 +13,12 @@ wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/maste
chmod a+x ./setup.sh chmod a+x ./setup.sh
``` ```
!!! warning "`setup.sh` for Docker Mailserver version `v10.1.x` and below"
If you're using Docker Mailserver version `v10.1.x` or below, you will need to get `setup.sh` with a specific version. Substitute `<VERSION>` with the [tagged release version](https://github.com/docker-mailserver/docker-mailserver/tags) that you're using:
`wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/<VERSION>/setup.sh`.
## Usage ## Usage
Run `./setup.sh help` and you'll get ~~all you have ever wanted~~ some usage information: Run `./setup.sh help` and you'll get ~~all you have ever wanted~~ some usage information:
@ -42,15 +48,6 @@ DESCRIPTION
its arguments by appending help after your command. Currently, this its arguments by appending help after your command. Currently, this
does not work with all scripts. does not work with all scripts.
VERSION
The current version of this script is backwards compatible with versions of
docker-mailserver after 8.0.1. In case that there is not a more recent release,
this script is currently only working with the :edge tag.
You can download the script for your release by substituting TAG from the
following URL, where TAG looks like 'vX.X.X':
https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/TAG/setup.sh
[SUB]COMMANDS [SUB]COMMANDS
COMMAND email := COMMAND email :=
./setup.sh email add <EMAIL ADDRESS> [<PASSWORD>] ./setup.sh email add <EMAIL ADDRESS> [<PASSWORD>]

318
setup.sh
View file

@ -1,37 +1,63 @@
#! /bin/bash #! /bin/bash
# version v0.3.0 stable # version v1.0.0
# executed manually / via Make # executed manually / via Make
# task wrapper for various setup scripts # task wrapper for various setup scripts
SCRIPT='setup.sh' SCRIPT='setup.sh'
WHITE="\e[37m"
RED="\e[31m"
PURPLE="\e[35m"
YELLOW="\e[93m"
ORANGE="\e[38;5;214m"
CYAN="\e[96m"
BLUE="\e[34m"
LBLUE="\e[94m"
BOLD="\e[1m"
RESET="\e[0m"
set -euEo pipefail set -euEo pipefail
trap '__log_err "${FUNCNAME[0]:-?}" "${BASH_COMMAND:-?}" "${LINENO:-?}" "${?:-?}"' ERR trap '__err "${FUNCNAME[0]:-?}" "${BASH_COMMAND:-?}" "${LINENO:-?}" "${?:-?}"' ERR
function __log_err function __err
{ {
printf "\n--- ${BOLD}${RED}UNCHECKED ERROR${RESET}\n%s\n%s\n%s\n%s\n\n" \ [[ ${4} -gt 1 ]] && exit 1
" - script = ${SCRIPT:-${0}}" \
" - function = ${1} / ${2}" \
" - line = ${3}" \
" - exit code = ${4}" >&2
printf "Make sure you use a version of this script that matches local ERR_MSG='--- \e[31m\e[1mUNCHECKED ERROR\e[0m'
the version / tag of docker-mailserver. Please read the ERR_MSG+="\n - script = ${SCRIPT:-${0}}"
'Get the tools' section in the README on GitHub careful- ERR_MSG+="\n - function = ${1} / ${2}"
ly and use ./setup.sh help and read the VERSION section.\n" >&2 ERR_MSG+="\n - line = ${3}"
ERR_MSG+="\n - exit code = ${4}"
ERR_MSG+='\n'
echo -e "${ERR_MSG}"
}
function _show_local_usage
{
local WHITE="\e[37m"
local ORANGE="\e[38;5;214m"
local LBLUE="\e[94m"
local RESET="\e[0m"
# shellcheck disable=SC2059
printf "${ORANGE}OPTIONS${RESET}
${LBLUE}Config path, container or image adjustments${RESET}
-i IMAGE_NAME
Provides the name of the docker-mailserver image. The default value is
${WHITE}docker.io/mailserver/docker-mailserver:latest${RESET}
-c CONTAINER_NAME
Provides the name of the running container.
-p PATH
Provides the config folder path to the temporary container (does not work if docker-mailserver container already exists).
${LBLUE}SELinux${RESET}
-z
Allows container access to the bind mount content that is shared among
multiple containers on a SELinux-enabled host.
-Z
Allows container access to the bind mount content that is private and
unshared with other containers on a SELinux-enabled host.
${ORANGE}EXIT STATUS${RESET}
Exit status is 0 if the command was successful. If there was an unexpected error, an error
message is shown describing the error. In case of an error, the script will exit with exit
status 1.
"
} }
function _get_absolute_script_directory function _get_absolute_script_directory
@ -39,7 +65,8 @@ function _get_absolute_script_directory
if [[ "$(uname)" == "Darwin" ]] if [[ "$(uname)" == "Darwin" ]]
then then
readlink() { readlink() {
greadlink "${@:+$@}" # Requires coreutils # requires coreutils
greadlink "${@:+$@}"
} }
fi fi
if dirname "$(readlink -f "${0}")" &>/dev/null if dirname "$(readlink -f "${0}")" &>/dev/null
@ -70,7 +97,9 @@ function _check_root
{ {
if [[ ${EUID} -ne 0 ]] if [[ ${EUID} -ne 0 ]]
then then
echo "Curently docker-mailserver doesn't support podman's rootless mode, please run this script as root user." echo "Curently, DMS doesn't support podman's rootless mode.
Please run this script as root user."
exit 1 exit 1
fi fi
} }
@ -81,7 +110,7 @@ function _update_config_path
then then
VOLUME=$(${CRI} inspect "${CONTAINER_NAME}" \ VOLUME=$(${CRI} inspect "${CONTAINER_NAME}" \
--format="{{range .Mounts}}{{ println .Source .Destination}}{{end}}" | \ --format="{{range .Mounts}}{{ println .Source .Destination}}{{end}}" | \
grep "/tmp/docker-mailserver$" 2>/dev/null) grep "/tmp/docker-mailserver$" 2>/dev/null || :)
fi fi
if [[ -n ${VOLUME} ]] if [[ -n ${VOLUME} ]]
@ -90,137 +119,6 @@ function _update_config_path
fi fi
} }
function _inspect
{
if _docker_image_exists "${IMAGE_NAME}"
then
echo "Image: ${IMAGE_NAME}"
else
echo "Image: '${IMAGE_NAME}' cant be found."
fi
if [[ -n ${CONTAINER_NAME} ]]
then
echo "Container: ${CONTAINER_NAME}"
echo "Config mount: ${CONFIG_PATH}"
else
echo "Container: Not running, please start docker-mailserver."
fi
}
function _usage
{
# shellcheck disable=SC2059
printf "${PURPLE}SETUP${RED}(${YELLOW}1${RED})
${ORANGE}NAME${RESET}
${SCRIPT:-${0}} - docker-mailserver administration script
${ORANGE}SYNOPSIS${RESET}
./${SCRIPT:-${0}} [ OPTIONS${RED}...${RESET} ] COMMAND [ help ${RED}|${RESET} ARGUMENTS${RED}...${RESET} ]
COMMAND ${RED}:=${RESET} { email ${RED}|${RESET} alias ${RED}|${RESET} quota ${RED}|${RESET} config ${RED}|${RESET} relay ${RED}|${RESET} debug } SUBCOMMAND
${ORANGE}DESCRIPTION${RESET}
This is the main administration script that you use for all interactions with your
mail server. Setup, configuration and much more is done with this script.
Please note that this script executes most of its commands inside the running 'mailserver' container itself.
If it cannot find a running container, it will attempt to run one using any available tags
which include label=org.opencontainers.image.title=\"docker-mailserver\" and then run the necessary commands.
If the tag for the container is not found, this script will pull the ${WHITE}:latest${RESET} tag of
${WHITE}docker.io/mailserver/docker-mailserver${RESET}. This tag refers to the latest release,
see the tagging convention in the README under
${BLUE}https://github.com/docker-mailserver/docker-mailserver/blob/master/README.md${RESET}
You will be able to see detailed information about the script you're invoking and
its arguments by appending ${WHITE}help${RESET} after your command. Currently, this
does not work with all scripts.
${ORANGE}VERSION${RESET}
The current version of this script is backwards compatible with versions of
${WHITE}docker-mailserver${RESET} ${BOLD}after${RESET} ${BLUE}8.0.1${RESET}. In case that there is not a more recent release,
this script is currently only working with the ${WHITE}:edge${RESET} tag.
You can download the script for your release by substituting TAG from the
following URL, where TAG looks like 'vX.X.X':
https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/TAG/setup.sh
${ORANGE}OPTIONS${RESET}
${LBLUE}Config path, container or image adjustments${RESET}
-i IMAGE_NAME
Provides the name of the docker-mailserver image. The default value is
${WHITE}docker.io/mailserver/docker-mailserver:latest${RESET}
-c CONTAINER_NAME
Provides the name of the running container.
-p PATH
Provides the config folder path to the temporary container (does not work if docker-mailserver container already exists). The default is
${WHITE}${DIR}/config/${RESET}
${LBLUE}SELinux${RESET}
-z
Allows container access to the bind mount content that is shared among
multiple containers on a SELinux-enabled host.
-Z
Allows container access to the bind mount content that is private and
unshared with other containers on a SELinux-enabled host.
${RED}[${ORANGE}SUB${RED}]${ORANGE}COMMANDS${RESET}
${LBLUE}COMMAND${RESET} email ${RED}:=${RESET}
${0} email ${CYAN}add${RESET} <EMAIL ADDRESS> [<PASSWORD>]
${0} email ${CYAN}update${RESET} <EMAIL ADDRESS> [<PASSWORD>]
${0} email ${CYAN}del${RESET} [ OPTIONS${RED}...${RESET} ] <EMAIL ADDRESS> [ <EMAIL ADDRESS>${RED}...${RESET} ]
${0} email ${CYAN}restrict${RESET} <add${RED}|${RESET}del${RED}|${RESET}list> <send${RED}|${RESET}receive> [<EMAIL ADDRESS>]
${0} email ${CYAN}list${RESET}
${LBLUE}COMMAND${RESET} alias ${RED}:=${RESET}
${0} alias ${CYAN}add${RESET} <EMAIL ADDRESS> <RECIPIENT>
${0} alias ${CYAN}del${RESET} <EMAIL ADDRESS> <RECIPIENT>
${0} alias ${CYAN}list${RESET}
${LBLUE}COMMAND${RESET} quota ${RED}:=${RESET}
${0} quota ${CYAN}set${RESET} <EMAIL ADDRESS> [<QUOTA>]
${0} quota ${CYAN}del${RESET} <EMAIL ADDRESS>
${LBLUE}COMMAND${RESET} config ${RED}:=${RESET}
${0} config ${CYAN}dkim${RESET} [ ARGUMENTS${RED}...${RESET} ]
${LBLUE}COMMAND${RESET} relay ${RED}:=${RESET}
${0} relay ${CYAN}add-domain${RESET} <DOMAIN> <HOST> [<PORT>]
${0} relay ${CYAN}add-auth${RESET} <DOMAIN> <USERNAME> [<PASSWORD>]
${0} relay ${CYAN}exclude-domain${RESET} <DOMAIN>
${LBLUE}COMMAND${RESET} debug ${RED}:=${RESET}
${0} debug ${CYAN}fetchmail${RESET}
${0} debug ${CYAN}fail2ban${RESET} [unban <IP>]
${0} debug ${CYAN}show-mail-logs${RESET}
${0} debug ${CYAN}inspect${RESET}
${0} debug ${CYAN}login${RESET} <COMMANDS>
${ORANGE}EXAMPLES${RESET}
${WHITE}./setup.sh email add test@domain.tld${RESET}
Add the email account ${WHITE}test@domain.tld${RESET}. You will be prompted
to input a password afterwards since no password was supplied.
${WHITE}./setup.sh config dkim keysize 2048 domain 'whoami.com,whoareyou.org'${RESET}
Creates keys of length 2048 but in an LDAP setup where domains are not known to
Postfix by default, so you need to provide them yourself in a comma-separated list.
${WHITE}./setup.sh config dkim help${RESET}
This will provide you with a detailed explanation on how to use the ${WHITE}
config dkim${RESET} command, showing what arguments can be passed and what they do.
${ORANGE}EXIT STATUS${RESET}
Exit status is 0 if the command was successful. If there was an unexpected error, an error
message is shown describing the error. In case of an error, the script will exit with exit
status 1.
"
}
function _docker_image_exists function _docker_image_exists
{ {
${CRI} history -q "${1}" &>/dev/null ${CRI} history -q "${1}" &>/dev/null
@ -236,9 +134,9 @@ function _docker_image
${CRI} pull "${IMAGE_NAME}" ${CRI} pull "${IMAGE_NAME}"
fi fi
${CRI} run --rm \ ${CRI} run --rm "${USE_TTY}" \
-v "${CONFIG_PATH}:/tmp/docker-mailserver${USE_SELINUX}" \ -v "${CONFIG_PATH}:/tmp/docker-mailserver${USE_SELINUX}" \
"${USE_TTY}" "${IMAGE_NAME}" "${@:+$@}" "${IMAGE_NAME}" "${@:+$@}"
} }
function _docker_container function _docker_container
@ -247,7 +145,8 @@ function _docker_container
then then
${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}" ${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}"
else else
# If no container yet, run a temporary one: https://github.com/docker-mailserver/docker-mailserver/pull/1874#issuecomment-809781531 # if no container is running, run a temporary one:
# https://github.com/docker-mailserver/docker-mailserver/pull/1874#issuecomment-809781531
_docker_image "${@:+$@}" _docker_image "${@:+$@}"
fi fi
} }
@ -263,7 +162,7 @@ function _main
_check_root _check_root
else else
echo "No supported Container Runtime Interface detected." echo "No supported Container Runtime Interface detected."
exit 10 exit 1
fi fi
INFO=$(${CRI} ps --no-trunc --format "{{.Image}};{{.Names}}" --filter \ INFO=$(${CRI} ps --no-trunc --format "{{.Image}};{{.Names}}" --filter \
@ -288,33 +187,29 @@ function _main
fi fi
local OPTIND local OPTIND
while getopts ":c:i:p:hzZ" OPT while getopts ":c:i:p:zZ" OPT
do do
case ${OPT} in case ${OPT} in
i ) IMAGE_NAME="${OPTARG}" ;; ( i ) IMAGE_NAME="${OPTARG}" ;;
z ) USE_SELINUX=":z" ;; ( z | Z ) USE_SELINUX=":${OPTARG}" ;;
Z ) USE_SELINUX=":Z" ;; ( c ) CONTAINER_NAME="${OPTARG}" ;;
c )
# container specified, connect to running instance
CONTAINER_NAME="${OPTARG}"
;;
p ) ( p )
case "${OPTARG}" in case "${OPTARG}" in
/* ) WISHED_CONFIG_PATH="${OPTARG}" ;; ( /* ) WISHED_CONFIG_PATH="${OPTARG}" ;;
* ) WISHED_CONFIG_PATH="${DIR}/${OPTARG}" ;; ( * ) WISHED_CONFIG_PATH="${DIR}/${OPTARG}" ;;
esac esac
if [[ ! -d ${WISHED_CONFIG_PATH} ]] if [[ ! -d ${WISHED_CONFIG_PATH} ]]
then then
echo "Directory doesn't exist" echo "Specified directory '${WISHED_CONFIG_PATH}' doesn't exist" >&2
_usage exit 1
exit 40
fi fi
;; ;;
* ) ( * )
echo "Invalid option: -${OPT}" >&2 echo "Invalid option: -${OPT}" >&2
exit 1
;; ;;
esac esac
@ -335,75 +230,10 @@ function _main
CONFIG_PATH=${WISHED_CONFIG_PATH} CONFIG_PATH=${WISHED_CONFIG_PATH}
fi fi
_docker_container setup "${@:+$@}"
[[ ${1} == 'help' ]] && _show_local_usage
case ${1:-} in return 0
email )
case ${2:-} in
add ) shift 2 ; _docker_container addmailuser "${@:+$@}" ;;
update ) shift 2 ; _docker_container updatemailuser "${@:+$@}" ;;
del ) shift 2 ; _docker_container delmailuser "${@:+$@}" ;;
restrict ) shift 2 ; _docker_container restrict-access "${@:+$@}" ;;
list ) _docker_container listmailuser ;;
* ) _usage ;;
esac
;;
alias )
case ${2:-} in
add ) shift 2 ; _docker_container addalias "${1}" "${2}" ;;
del ) shift 2 ; _docker_container delalias "${1}" "${2}" ;;
list ) shift 2 ; _docker_container listalias ;;
* ) _usage ;;
esac
;;
quota )
case ${2:-} in
set ) shift 2 ; _docker_container setquota "${@:+$@}" ;;
del ) shift 2 ; _docker_container delquota "${@:+$@}" ;;
* ) _usage ;;
esac
;;
config )
case ${2:-} in
dkim ) shift 2 ; _docker_container open-dkim "${@:+$@}" ;;
* ) _usage ;;
esac
;;
relay )
case ${2:-} in
add-domain ) shift 2 ; _docker_container addrelayhost "${@:+$@}" ;;
add-auth ) shift 2 ; _docker_container addsaslpassword "${@:+$@}" ;;
exclude-domain ) shift 2 ; _docker_container excluderelaydomain "${@:+$@}" ;;
* ) _usage ;;
esac
;;
debug )
case ${2:-} in
fetchmail ) _docker_container debug-fetchmail ;;
fail2ban ) shift 2 ; _docker_container fail2ban "${@:+$@}" ;;
show-mail-logs ) _docker_container cat /var/log/mail/mail.log ;;
inspect ) _inspect ;;
login )
shift 2
if [[ -z ${1:-} ]]
then
_docker_container /bin/bash
else
_docker_container /bin/bash -c "${@:+$@}"
fi
;;
* ) _usage ; exit 1 ;;
esac
;;
help ) _usage ;;
* ) _usage ; exit 1 ;;
esac
} }
_main "${@:+$@}" _main "${@:+$@}"

View file

@ -1,239 +0,0 @@
#! /bin/bash
# version v1.0.0
# executed manually / via Make
# task wrapper for various setup scripts
SCRIPT='setup.sh'
set -euEo pipefail
trap '__err "${FUNCNAME[0]:-?}" "${BASH_COMMAND:-?}" "${LINENO:-?}" "${?:-?}"' ERR
function __err
{
[[ ${4} -gt 1 ]] && exit 1
local ERR_MSG='--- \e[31m\e[1mUNCHECKED ERROR\e[0m'
ERR_MSG+="\n - script = ${SCRIPT:-${0}}"
ERR_MSG+="\n - function = ${1} / ${2}"
ERR_MSG+="\n - line = ${3}"
ERR_MSG+="\n - exit code = ${4}"
ERR_MSG+='\n'
echo -e "${ERR_MSG}"
}
function _show_local_usage
{
local WHITE="\e[37m"
local ORANGE="\e[38;5;214m"
local LBLUE="\e[94m"
local RESET="\e[0m"
# shellcheck disable=SC2059
printf "${ORANGE}OPTIONS${RESET}
${LBLUE}Config path, container or image adjustments${RESET}
-i IMAGE_NAME
Provides the name of the docker-mailserver image. The default value is
${WHITE}docker.io/mailserver/docker-mailserver:latest${RESET}
-c CONTAINER_NAME
Provides the name of the running container.
-p PATH
Provides the config folder path to the temporary container (does not work if docker-mailserver container already exists).
${LBLUE}SELinux${RESET}
-z
Allows container access to the bind mount content that is shared among
multiple containers on a SELinux-enabled host.
-Z
Allows container access to the bind mount content that is private and
unshared with other containers on a SELinux-enabled host.
${ORANGE}EXIT STATUS${RESET}
Exit status is 0 if the command was successful. If there was an unexpected error, an error
message is shown describing the error. In case of an error, the script will exit with exit
status 1.
"
}
function _get_absolute_script_directory
{
if [[ "$(uname)" == "Darwin" ]]
then
readlink() {
# requires coreutils
greadlink "${@:+$@}"
}
fi
if dirname "$(readlink -f "${0}")" &>/dev/null
then
DIR="$(dirname "$(readlink -f "${0}")")"
elif realpath -e -L "${0}" &>/dev/null
then
DIR="$(realpath -e -L "${0}")"
DIR="${DIR%/setup.sh}"
fi
}
DIR="$(pwd)"
_get_absolute_script_directory
CRI=
CONFIG_PATH=
CONTAINER_NAME=
DEFAULT_CONFIG_PATH="${DIR}/config"
IMAGE_NAME=
INFO=
USE_TTY=
USE_SELINUX=
VOLUME=
WISHED_CONFIG_PATH=
function _check_root
{
if [[ ${EUID} -ne 0 ]]
then
echo "Curently, DMS doesn't support podman's rootless mode.
Please run this script as root user."
exit 1
fi
}
function _update_config_path
{
if [[ -n ${CONTAINER_NAME} ]]
then
VOLUME=$(${CRI} inspect "${CONTAINER_NAME}" \
--format="{{range .Mounts}}{{ println .Source .Destination}}{{end}}" | \
grep "/tmp/docker-mailserver$" 2>/dev/null || :)
fi
if [[ -n ${VOLUME} ]]
then
CONFIG_PATH=$(echo "${VOLUME}" | awk '{print $1}')
fi
}
function _docker_image_exists
{
${CRI} history -q "${1}" &>/dev/null
return ${?}
}
function _docker_image
{
# start temporary container with specified image
if ! _docker_image_exists "${IMAGE_NAME}"
then
echo "Image '${IMAGE_NAME}' not found. Pulling ..."
${CRI} pull "${IMAGE_NAME}"
fi
${CRI} run --rm "${USE_TTY}" \
-v "${CONFIG_PATH}:/tmp/docker-mailserver${USE_SELINUX}" \
"${IMAGE_NAME}" "${@:+$@}"
}
function _docker_container
{
if [[ -n ${CONTAINER_NAME} ]]
then
${CRI} exec "${USE_TTY}" "${CONTAINER_NAME}" "${@:+$@}"
else
# if no container is running, run a temporary one:
# https://github.com/docker-mailserver/docker-mailserver/pull/1874#issuecomment-809781531
_docker_image "${@:+$@}"
fi
}
function _main
{
if command -v docker &>/dev/null
then
CRI=docker
elif command -v podman &>/dev/null
then
CRI=podman
_check_root
else
echo "No supported Container Runtime Interface detected."
exit 1
fi
INFO=$(${CRI} ps --no-trunc --format "{{.Image}};{{.Names}}" --filter \
label=org.opencontainers.image.title="docker-mailserver" | tail -1)
IMAGE_NAME=${INFO%;*}
CONTAINER_NAME=${INFO#*;}
if [[ -z ${IMAGE_NAME} ]]
then
IMAGE_NAME=${NAME:-docker.io/mailserver/docker-mailserver:latest}
fi
if test -t 0
then
USE_TTY="-ti"
else
# GitHub Actions will fail (or really anything else
# lacking an interactive tty) if we don't set a
# value here; "-t" alone works for these cases.
USE_TTY="-t"
fi
local OPTIND
while getopts ":c:i:p:zZ" OPT
do
case ${OPT} in
( i ) IMAGE_NAME="${OPTARG}" ;;
( z | Z ) USE_SELINUX=":${OPTARG}" ;;
( c ) CONTAINER_NAME="${OPTARG}" ;;
( p )
case "${OPTARG}" in
( /* ) WISHED_CONFIG_PATH="${OPTARG}" ;;
( * ) WISHED_CONFIG_PATH="${DIR}/${OPTARG}" ;;
esac
if [[ ! -d ${WISHED_CONFIG_PATH} ]]
then
echo "Specified directory '${WISHED_CONFIG_PATH}' doesn't exist" >&2
exit 1
fi
;;
( * )
echo "Invalid option: -${OPT}" >&2
exit 1
;;
esac
done
shift $(( OPTIND - 1 ))
if [[ -z ${WISHED_CONFIG_PATH} ]]
then
# no wished config path
_update_config_path
if [[ -z ${CONFIG_PATH} ]]
then
CONFIG_PATH=${DEFAULT_CONFIG_PATH}
fi
else
CONFIG_PATH=${WISHED_CONFIG_PATH}
fi
_docker_container setup "${@:+$@}"
[[ ${1} == 'help' ]] && _show_local_usage
return 0
}
_main "${@:+$@}"

View file

@ -101,56 +101,56 @@ function _main
{ {
case ${1:-} in case ${1:-} in
email ) ( email )
case ${2:-} in case ${2:-} in
add ) shift 2 ; addmailuser "${@}" ;; ( add ) shift 2 ; addmailuser "${@}" ;;
update ) shift 2 ; updatemailuser "${@}" ;; ( update ) shift 2 ; updatemailuser "${@}" ;;
del ) shift 2 ; delmailuser "${@}" ;; ( del ) shift 2 ; delmailuser "${@}" ;;
restrict ) shift 2 ; restrict-access "${@}" ;; ( restrict ) shift 2 ; restrict-access "${@}" ;;
list ) listmailuser ;; ( list ) listmailuser ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${1}" "${2}" ;;
esac esac
;; ;;
alias ) ( alias )
case ${2:-} in case ${2:-} in
add ) shift 2 ; addalias "${1}" "${2}" ;; ( add ) shift 2 ; addalias "${1}" "${2}" ;;
del ) shift 2 ; delalias "${1}" "${2}" ;; ( del ) shift 2 ; delalias "${1}" "${2}" ;;
list ) shift 2 ; listalias ;; ( list ) shift 2 ; listalias ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${1}" "${2}" ;;
esac esac
;; ;;
quota ) ( quota )
case ${2:-} in case ${2:-} in
set ) shift 2 ; setquota "${@}" ;; ( set ) shift 2 ; setquota "${@}" ;;
del ) shift 2 ; delquota "${@}" ;; ( del ) shift 2 ; delquota "${@}" ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${1}" "${2}" ;;
esac esac
;; ;;
config ) ( config )
case ${2:-} in case ${2:-} in
dkim ) shift 2 ; open-dkim "${@}" ;; ( dkim ) shift 2 ; open-dkim "${@}" ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${1}" "${2}" ;;
esac esac
;; ;;
relay ) ( relay )
case ${2:-} in case ${2:-} in
add-domain ) shift 2 ; addrelayhost "${@}" ;; ( add-domain ) shift 2 ; addrelayhost "${@}" ;;
add-auth ) shift 2 ; addsaslpassword "${@}" ;; ( add-auth ) shift 2 ; addsaslpassword "${@}" ;;
exclude-domain ) shift 2 ; excluderelaydomain "${@}" ;; ( exclude-domain ) shift 2 ; excluderelaydomain "${@}" ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${1}" "${2}" ;;
esac esac
;; ;;
debug ) ( debug )
case ${2:-} in case ${2:-} in
fetchmail ) debug-fetchmail ;; ( fetchmail ) debug-fetchmail ;;
fail2ban ) shift 2 ; fail2ban "${@}" ;; ( fail2ban ) shift 2 ; fail2ban "${@}" ;;
show-mail-logs ) cat /var/log/mail/mail.log ;; ( show-mail-logs ) cat /var/log/mail/mail.log ;;
login ) ( login )
shift 2 shift 2
if [[ -z ${1:-} ]] if [[ -z ${1:-} ]]
then then
@ -159,12 +159,12 @@ function _main
/bin/bash -c "${@}" /bin/bash -c "${@}"
fi fi
;; ;;
* ) _invalid_command "${1}" "${2}" ;; ( * ) _invalid_command "${*}" ;;
esac esac
;; ;;
help ) _usage ;; ( help ) _usage ;;
* ) _invalid_command "${*}" ;; ( * ) _invalid_command "${*}" ;;
esac esac
} }

View file

@ -92,7 +92,7 @@ function remove_lock
{ {
LOCK_FILE="${LOCK_FILE:-"/tmp/docker-mailserver/${SCRIPT_NAME}.lock"}" LOCK_FILE="${LOCK_FILE:-"/tmp/docker-mailserver/${SCRIPT_NAME}.lock"}"
[[ -z "${LOCK_ID}" ]] && errex "Cannot remove ${LOCK_FILE} as there is no LOCK_ID set" [[ -z "${LOCK_ID}" ]] && errex "Cannot remove ${LOCK_FILE} as there is no LOCK_ID set"
if [[ -e "${LOCK_FILE}" && $(grep -c "${LOCK_ID}" "${LOCK_FILE}") -gt 0 ]] # Ensure we don't delete a lock that's not ours if [[ -e "${LOCK_FILE}" ]] && grep -q "${LOCK_ID}" "${LOCK_FILE}" # Ensure we don't delete a lock that's not ours
then then
rm -f "${LOCK_FILE}" rm -f "${LOCK_FILE}"
_notify 'inf' "Removed lock ${LOCK_FILE}." _notify 'inf' "Removed lock ${LOCK_FILE}."