Compare commits
	
		
			5 Commits
		
	
	
		
			8d10a1a3b9
			...
			c8b328e707
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c8b328e707 | |||
| fb4dcab29a | |||
| 5382dd26d9 | |||
| bd36035a9f | |||
| 389f5ef059 | 
@ -70,6 +70,7 @@ badParam() {
 | 
			
		||||
cleanup() {
 | 
			
		||||
    # cleanup 503 if copied
 | 
			
		||||
    if [ "$err503Copied" -eq 1 ]; then
 | 
			
		||||
        # shellcheck disable=SC2129
 | 
			
		||||
        if ! rm -f "$webroot/$err503File" 2>>"$logFile"; then
 | 
			
		||||
            printf "%s[%s] -- [WARNING] Could not remove 503 error page." \
 | 
			
		||||
                "$warn" "$(stamp)" >>"$logFile"
 | 
			
		||||
@ -98,34 +99,34 @@ cleanup() {
 | 
			
		||||
        printf "%s[%s] -- [INFO] POSTFIX container is running --%s\n" \
 | 
			
		||||
            "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
    else
 | 
			
		||||
        exitError 102 'Could not start POSTFIX container.'
 | 
			
		||||
        exitError 102 'Could not start POSTFIX container.' 'final'
 | 
			
		||||
    fi
 | 
			
		||||
    doDocker start dovecot
 | 
			
		||||
    if [ "$dockerResultState" = "true" ]; then
 | 
			
		||||
        printf "%s[%s] -- [INFO] DOVECOT container is running --%s\n" \
 | 
			
		||||
            "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
    else
 | 
			
		||||
        exitError 102 'Could not start DOVECOT container.'
 | 
			
		||||
        exitError 102 'Could not start DOVECOT container.' 'final'
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
doDocker() {
 | 
			
		||||
    containerName="$(docker ps -a --format '{{ .Names }}' --filter name=${COMPOSE_PROJECT_NAME}_${2}-mailcow_1)"
 | 
			
		||||
    containerName="$(docker ps -a --format '{{ .Names }}' --filter "name=${COMPOSE_PROJECT_NAME}_${2}-mailcow_1" --filter "name=${COMPOSE_PROJECT_NAME}-${2}-mailcow-1")"
 | 
			
		||||
 | 
			
		||||
    # determine action to take
 | 
			
		||||
    if [ "$1" = "stop" ]; then
 | 
			
		||||
        printf "%s[%s] -- [INFO] Stopping %s-mailcow container --%s\n" \
 | 
			
		||||
            "$cyan" "$(stamp)" "$2" "$norm" >>"$logFile"
 | 
			
		||||
        docker-compose -f "$mcDockerCompose" stop --timeout "$dockerStopTimeout" "$2-mailcow" 2>>"$logFile"
 | 
			
		||||
        ${dockerCmd} -f "$mcDockerCompose" stop --timeout "$dockerStopTimeout" "$2-mailcow" 2>>"$logFile"
 | 
			
		||||
        # set result vars
 | 
			
		||||
        dockerResultState="$(docker inspect -f '{{ .State.Running }}' $containerName)"
 | 
			
		||||
        dockerResultExit="$(docker inspect -f '{{ .State.ExitCode }}' $containerName)"
 | 
			
		||||
        dockerResultState="$(docker inspect -f '{{ .State.Running }}' "$containerName")"
 | 
			
		||||
        dockerResultExit="$(docker inspect -f '{{ .State.ExitCode }}' "$containerName")"
 | 
			
		||||
    elif [ "$1" = "start" ]; then
 | 
			
		||||
        printf "%s[%s] -- [INFO] Starting %s-mailcow container --%s\n" \
 | 
			
		||||
            "$cyan" "$(stamp)" "$2" "$norm" >>"$logFile"
 | 
			
		||||
        docker-compose -f "$mcDockerCompose" start "$2-mailcow" 2>>"$logFile"
 | 
			
		||||
        ${dockerCmd} -f "$mcDockerCompose" start "$2-mailcow" 2>>"$logFile"
 | 
			
		||||
        # set result vars
 | 
			
		||||
        dockerResultState="$(docker inspect -f '{{ .State.Running }}' $containerName)"
 | 
			
		||||
        dockerResultState="$(docker inspect -f '{{ .State.Running }}' "$containerName")"
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -133,7 +134,7 @@ doDocker() {
 | 
			
		||||
exitError() {
 | 
			
		||||
    printf "%s[%s] -- [ERROR] %s: %s --%s\n" \
 | 
			
		||||
        "$err" "$(stamp)" "$1" "$2" "$norm" >>"$logFile"
 | 
			
		||||
    cleanup
 | 
			
		||||
    if [ ! "$3" = "final" ]; then cleanup; fi
 | 
			
		||||
    # note script completion with error
 | 
			
		||||
    printf "%s[%s] --- %s execution completed with error ---%s\n" \
 | 
			
		||||
        "$err" "$(stamp)" "$scriptName" "$norm" >>"$logFile"
 | 
			
		||||
@ -144,7 +145,8 @@ exitError() {
 | 
			
		||||
scriptHelp() {
 | 
			
		||||
    newline
 | 
			
		||||
    printf "%sUsage: %s [parameters]%s\n\n" "$bold" "$scriptName" "$norm"
 | 
			
		||||
    textblock "There are NO mandatory parameters. If a parameter is not supplied, its default value will be used. In the case of a switch parameter, it will remain DEactivated if NOT specified."
 | 
			
		||||
    textblock "There are NO mandatory parameters. If a parameter is not supplied, its default value will be used. In 
 | 
			
		||||
    the case of a switch parameter, it will remain *deactivated* if NOT specified."
 | 
			
		||||
    newline
 | 
			
		||||
    textblock "Parameters are listed then followed by a description of their effect on the following line. Finally, if a default value exists, it will be listed on the next line in (parentheses)."
 | 
			
		||||
    newline
 | 
			
		||||
@ -194,7 +196,7 @@ scriptHelp() {
 | 
			
		||||
    textblock "${magenta}--- mailcow related ---${norm}"
 | 
			
		||||
    newline
 | 
			
		||||
    switchTextblock "-d | --docker-compose"
 | 
			
		||||
    textblock "Path to mailcow's 'docker-compose.yml' file."
 | 
			
		||||
    textblock "Path to the mailcow 'docker-compose.yml' file."
 | 
			
		||||
    defaultsTextblock "(/opt/mailcow-dockerized/docker-compose.yml)"
 | 
			
		||||
    newline
 | 
			
		||||
    switchTextblock "-m | --mailcow-config"
 | 
			
		||||
@ -263,6 +265,7 @@ configDetails="$scriptPath/${scriptName%.*}.details"
 | 
			
		||||
err503Copied=0
 | 
			
		||||
sqlDumpDirCreated=0
 | 
			
		||||
exclusions=0
 | 
			
		||||
dockerCmd="docker compose"
 | 
			
		||||
borgPath="/usr/bin/borg"
 | 
			
		||||
# borg output verbosity -- normal
 | 
			
		||||
borgCreateParams='--stats'
 | 
			
		||||
@ -430,6 +433,14 @@ if [ "$(id -u)" -ne 0 ]; then
 | 
			
		||||
    printf "\n%sERROR: script MUST be run as ROOT%s\n\n" "$err" "$norm"
 | 
			
		||||
    exit 2
 | 
			
		||||
fi
 | 
			
		||||
# verify compose installed and set proper commands based on version
 | 
			
		||||
if ! (docker compose version >/dev/null 2>&1); then
 | 
			
		||||
    if ! (docker-compose --version >/dev/null 2>&1); then
 | 
			
		||||
        printf "\n%sERROR: Docker Compose not installed or not functioning%s\n\n" "$err" "$norm"
 | 
			
		||||
        exit 3
 | 
			
		||||
    fi
 | 
			
		||||
    dockerCmd="docker-compose"
 | 
			
		||||
fi
 | 
			
		||||
# does the details file exist?
 | 
			
		||||
if [ ! -f "$configDetails" ]; then
 | 
			
		||||
    badParam dne "(--details default)" "$configDetails"
 | 
			
		||||
@ -437,7 +448,7 @@ fi
 | 
			
		||||
# is borg installed?
 | 
			
		||||
if ! find "$borgPath" -type f -executable >/dev/null 2>&1; then
 | 
			
		||||
    printf "\n%sERROR: BORG cannot be found in the specified or default location on this system!%s\n\n" "$err" "$norm"
 | 
			
		||||
    exit 3
 | 
			
		||||
    exit 4
 | 
			
		||||
fi
 | 
			
		||||
# if 503 functionality is enabled, do 503 related files exist?
 | 
			
		||||
if [ "$use503" -eq 1 ]; then
 | 
			
		||||
@ -689,9 +700,9 @@ fi
 | 
			
		||||
### dump SQL
 | 
			
		||||
printf "%s[%s] -- [INFO] Dumping mailcow SQL database --%s\n" \
 | 
			
		||||
    "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 \
 | 
			
		||||
${dockerCmd} exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 \
 | 
			
		||||
    -u${DBUSER} -p${DBPASS} ${DBNAME} >"$sqlDumpDir/$sqlDumpFile" 2>>"$logFile"
 | 
			
		||||
dumpResult=$(docker-compose exec -T mysql-mailcow echo "$?")
 | 
			
		||||
dumpResult=$(${dockerCmd} exec -T mysql-mailcow echo "$?")
 | 
			
		||||
if [ "$dumpResult" -eq 0 ]; then
 | 
			
		||||
    printf "%s[%s] -- [INFO] SQL database dumped successfully --%s\n" \
 | 
			
		||||
        "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
@ -707,8 +718,8 @@ fi
 | 
			
		||||
# dump redis
 | 
			
		||||
printf "%s[%s] -- [INFO] Dumping mailcow redis database --%s\n" \
 | 
			
		||||
    "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
docker-compose exec -T redis-mailcow redis-cli save >>"$logFile" 2>&1
 | 
			
		||||
rdumpResult=$(docker-compose exec -T redis-mailcow echo "$?")
 | 
			
		||||
${dockerCmd} exec -T redis-mailcow redis-cli save >>"$logFile" 2>&1
 | 
			
		||||
rdumpResult=$(${dockerCmd} exec -T redis-mailcow echo "$?")
 | 
			
		||||
if [ "$rdumpResult" -eq 0 ]; then
 | 
			
		||||
    printf "%s[%s] -- [INFO] mailcow redis dumped successfully --%s\n" \
 | 
			
		||||
        "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
@ -772,10 +783,11 @@ else
 | 
			
		||||
    warnCount=$((warnCount + 1))
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
### execute borg prune if paramters are provided, otherwise skip with a warning
 | 
			
		||||
### execute borg prune if parameters are provided, otherwise skip with a warning
 | 
			
		||||
if [ -n "${borgPruneSettings}" ]; then
 | 
			
		||||
    printf "%s[%s] -- [INFO] Executing borg prune operation --%s\n" \
 | 
			
		||||
        "$cyan" "$(stamp)" "$norm" >>"$logFile"
 | 
			
		||||
    # shellcheck disable=SC2086
 | 
			
		||||
    "${borgPath}" prune --show-rc -v ${borgPruneParams} ${borgPruneSettings} \
 | 
			
		||||
        2>>"$logFile"
 | 
			
		||||
    borgPruneResult="$?"
 | 
			
		||||
@ -834,7 +846,8 @@ exit 0
 | 
			
		||||
### error codes
 | 
			
		||||
# 1: parameter error
 | 
			
		||||
# 2: not run as root
 | 
			
		||||
# 3: borg not installed
 | 
			
		||||
# 3: docker compose not installed or not functioning
 | 
			
		||||
# 4: borg not installed
 | 
			
		||||
# 99: TERM signal trapped
 | 
			
		||||
# 100: could not change to mailcow-dockerized directory
 | 
			
		||||
# 101: could not stop container(s)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user