[Update] Formatting; Added new options

master
andre.peters 2018-01-24 09:24:40 +01:00
parent a569fb3435
commit 1f1ab0960c
1 changed files with 117 additions and 105 deletions

222
update.sh
View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
for bin in curl docker-compose docker git awk sha1sum; do for bin in curl docker-compose docker git awk sha1sum; do
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
done done
[[ ! -f mailcow.conf ]] && { echo "mailcow.conf is missing"; exit 1;} [[ ! -f mailcow.conf ]] && { echo "mailcow.conf is missing"; exit 1;}
@ -9,44 +9,57 @@ done
CONFIG_ARRAY=("SKIP_LETS_ENCRYPT" "USE_WATCHDOG" "WATCHDOG_NOTIFY_EMAIL" "SKIP_CLAMD" "SKIP_IP_CHECK" "SKIP_FAIL2BAN" "ADDITIONAL_SAN" "DOVEADM_PORT") CONFIG_ARRAY=("SKIP_LETS_ENCRYPT" "USE_WATCHDOG" "WATCHDOG_NOTIFY_EMAIL" "SKIP_CLAMD" "SKIP_IP_CHECK" "SKIP_FAIL2BAN" "ADDITIONAL_SAN" "DOVEADM_PORT")
sed -i '$a\' mailcow.conf sed -i '$a\' mailcow.conf
for option in ${CONFIG_ARRAY[@]}; do for option in ${CONFIG_ARRAY[@]}; do
if [[ ${option} == "ADDITIONAL_SAN" ]]; then if [[ ${option} == "ADDITIONAL_SAN" ]]; then
if ! grep -q ${option} mailcow.conf; then if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf" echo "Adding new option \"${option}\" to mailcow.conf"
echo "${option}=" >> mailcow.conf echo "${option}=" >> mailcow.conf
fi fi
elif [[ ${option} == "COMPOSE_PROJECT_NAME" ]]; then elif [[ ${option} == "COMPOSE_PROJECT_NAME" ]]; then
if ! grep -q ${option} mailcow.conf; then if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf" echo "Adding new option \"${option}\" to mailcow.conf"
echo "COMPOSE_PROJECT_NAME=mailcow-dockerized" >> mailcow.conf echo "COMPOSE_PROJECT_NAME=mailcow-dockerized" >> mailcow.conf
fi fi
elif [[ ${option} == "DOVEADM_PORT" ]]; then elif [[ ${option} == "DOVEADM_PORT" ]]; then
if ! grep -q ${option} mailcow.conf; then if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf" echo "Adding new option \"${option}\" to mailcow.conf"
echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf
fi fi
elif [[ ${option} == "WATCHDOG_NOTIFY_EMAIL" ]]; then elif [[ ${option} == "WATCHDOG_NOTIFY_EMAIL" ]]; then
if ! grep -q ${option} mailcow.conf; then if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf" echo "Adding new option \"${option}\" to mailcow.conf"
echo "WATCHDOG_NOTIFY_EMAIL=" >> mailcow.conf echo "WATCHDOG_NOTIFY_EMAIL=" >> mailcow.conf
fi fi
elif [[ ${option} == "LOG_LINES" ]]; then elif [[ ${option} == "LOG_LINES" ]]; then
if ! grep -q ${option} mailcow.conf; then if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf" echo "Adding new option \"${option}\" to mailcow.conf"
echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf
echo "LOG_LINES=9999" >> mailcow.conf echo "LOG_LINES=9999" >> mailcow.conf
fi fi
elif ! grep -q ${option} mailcow.conf; then elif [[ ${option} == "IPV4_NETWORK" ]]; then
echo "Adding new option \"${option}\" to mailcow.conf" if ! grep -q ${option} mailcow.conf; then
echo "${option}=n" >> mailcow.conf echo "Adding new option \"${option}\" to mailcow.conf"
fi echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf
echo "IPV4_NETWORK=172.22.1" >> mailcow.conf
fi
elif [[ ${option} == "IPV6_NETWORK" ]]; then
if ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo '# Internal IPv6 subnet in fd00::/8' >> mailcow.conf
echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf
fi
elif ! grep -q ${option} mailcow.conf; then
echo "Adding new option \"${option}\" to mailcow.conf"
echo "${option}=n" >> mailcow.conf
fi
done done
echo -en "Checking internet connection... " echo -en "Checking internet connection... "
curl -o /dev/null google.com -sm3 curl -o /dev/null google.com -sm3
if [[ $? != 0 ]]; then if [[ $? != 0 ]]; then
echo -e "\e[31mfailed\e[0m" echo -e "\e[31mfailed\e[0m"
exit 1 exit 1
else else
echo -e "\e[32mOK\e[0m" echo -e "\e[32mOK\e[0m"
fi fi
set -o pipefail set -o pipefail
@ -56,22 +69,22 @@ BRANCH=$(git rev-parse --abbrev-ref HEAD)
declare -a DC_PARAMS declare -a DC_PARAMS
while (($#)); do while (($#)); do
case "${1}" in case "${1}" in
--check|-c) --check|-c)
echo "Checking remote code for updates..." echo "Checking remote code for updates..."
git fetch origin ${BRANCH} git fetch origin ${BRANCH}
if ! git diff origin/${BRANCH} --quiet; then if ! git diff origin/${BRANCH} --quiet; then
echo "Updated code is available." echo "Updated code is available."
exit 0 exit 0
else else
echo "No updates available." echo "No updates available."
exit 3 exit 3
fi fi
;; ;;
--no-start) --no-start)
DC_PARAMS=(${DC_PARAMS[@]} "--no-start") DC_PARAMS=(${DC_PARAMS[@]} "--no-start")
;; ;;
esac esac
done done
echo -e "\e[32mChecking for newer update script...\e[0m" echo -e "\e[32mChecking for newer update script...\e[0m"
@ -80,22 +93,22 @@ git fetch origin ${BRANCH}
git checkout origin/${BRANCH} update.sh git checkout origin/${BRANCH} update.sh
SHA1_2=$(sha1sum update.sh) SHA1_2=$(sha1sum update.sh)
if [[ ${SHA1_1} != ${SHA1_2} ]]; then if [[ ${SHA1_1} != ${SHA1_2} ]]; then
echo "update.sh changed, please run this script again, exiting." echo "update.sh changed, please run this script again, exiting."
chmod +x update.sh chmod +x update.sh
exit 0 exit 0
fi fi
if [[ -f mailcow.conf ]]; then if [[ -f mailcow.conf ]]; then
source mailcow.conf source mailcow.conf
else else
echo -e "\e[31mNo mailcow.conf - is mailcow installed?\e[0m" echo -e "\e[31mNo mailcow.conf - is mailcow installed?\e[0m"
exit 1 exit 1
fi fi
read -r -p "Are you sure you want to update mailcow: dockerized? All containers will be stopped. [y/N] " response read -r -p "Are you sure you want to update mailcow: dockerized? All containers will be stopped. [y/N] " response
if [[ ! "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then if [[ ! "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "OK, exiting." echo "OK, exiting."
exit 0 exit 0
fi fi
echo -e "Stopping mailcow... " echo -e "Stopping mailcow... "
@ -115,31 +128,31 @@ git merge -Xtheirs -Xpatience -m "After update on ${DATE}"
# Need to use a variable to not pass return codes of if checks # Need to use a variable to not pass return codes of if checks
MERGE_RETURN=$? MERGE_RETURN=$?
if [[ ${MERGE_RETURN} == 128 ]]; then if [[ ${MERGE_RETURN} == 128 ]]; then
echo -e "\e[31m\nOh no, what happened?\n=> You most likely added files to your local mailcow instance that were now added to the official mailcow repository. Please move them to another location before updating mailcow.\e[0m" echo -e "\e[31m\nOh no, what happened?\n=> You most likely added files to your local mailcow instance that were now added to the official mailcow repository. Please move them to another location before updating mailcow.\e[0m"
exit 1 exit 1
elif [[ ${MERGE_RETURN} == 1 ]]; then elif [[ ${MERGE_RETURN} == 1 ]]; then
echo -e "\e[93mPotenial conflict, trying to fix...\e[0m" echo -e "\e[93mPotenial conflict, trying to fix...\e[0m"
git status --porcelain | grep -E "UD|DU" | awk '{print $2}' | xargs rm -v git status --porcelain | grep -E "UD|DU" | awk '{print $2}' | xargs rm -v
git add -A git add -A
git commit -m "After update on ${DATE}" > /dev/null git commit -m "After update on ${DATE}" > /dev/null
git checkout . git checkout .
echo -e "\e[32mRemoved and recreated files if necessary.\e[0m" echo -e "\e[32mRemoved and recreated files if necessary.\e[0m"
elif [[ ${MERGE_RETURN} != 0 ]]; then elif [[ ${MERGE_RETURN} != 0 ]]; then
echo -e "\e[31m\nOh no, something went wrong. Please check the error message above.\e[0m" echo -e "\e[31m\nOh no, something went wrong. Please check the error message above.\e[0m"
echo echo
echo "Run docker-compose up -d to restart your stack without updates or try again after fixing the mentioned errors." echo "Run docker-compose up -d to restart your stack without updates or try again after fixing the mentioned errors."
exit 1 exit 1
fi fi
echo -e "\e[32mFetching new docker-compose version...\e[0m" echo -e "\e[32mFetching new docker-compose version...\e[0m"
sleep 2 sleep 2
if [[ $(curl -sL -w "%{http_code}" https://www.servercow.de/docker-compose/latest.php -o /dev/null) == "200" ]]; then if [[ $(curl -sL -w "%{http_code}" https://www.servercow.de/docker-compose/latest.php -o /dev/null) == "200" ]]; then
LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php) LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php)
curl -#L https://github.com/docker/compose/releases/download/${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $(which docker-compose) curl -#L https://github.com/docker/compose/releases/download/${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $(which docker-compose)
chmod +x $(which docker-compose) chmod +x $(which docker-compose)
else else
echo -e "\e[33mCannot determine latest docker-compose version, skipping...\e[0m" echo -e "\e[33mCannot determine latest docker-compose version, skipping...\e[0m"
fi fi
echo -e "\e[32mFetching new images, if any...\e[0m" echo -e "\e[32mFetching new images, if any...\e[0m"
@ -157,43 +170,42 @@ docker-compose up -d --remove-orphans ${DC_PARAMS[@]}
echo -e "\e[32mCollecting garbage...\e[0m" echo -e "\e[32mCollecting garbage...\e[0m"
IMGS_TO_DELETE=() IMGS_TO_DELETE=()
for container in $(grep -oP "image: \Kmailcow.+" docker-compose.yml); do for container in $(grep -oP "image: \Kmailcow.+" docker-compose.yml); do
REPOSITORY=${container/:*} REPOSITORY=${container/:*}
TAG=${container/*:} TAG=${container/*:}
V_MAIN=${container/*.} V_MAIN=${container/*.}
V_SUB=${container/*.} V_SUB=${container/*.}
EXISTING_TAGS=$(docker images | grep ${REPOSITORY} | awk '{ print $2 }')
for existing_tag in ${EXISTING_TAGS[@]}; do
V_MAIN_EXISTING=${existing_tag/*.}
V_SUB_EXISTING=${existing_tag/*.}
# Not an integer
[[ ! $V_MAIN_EXISTING =~ ^[0-9]+$ ]] && continue
[[ ! $V_SUB_EXISTING =~ ^[0-9]+$ ]] && continue
EXISTING_TAGS=$(docker images | grep ${REPOSITORY} | awk '{ print $2 }') if [[ $V_MAIN_EXISTING == "latest" ]]; then
for existing_tag in ${EXISTING_TAGS[@]}; do echo "Found deprecated label \"latest\" for repository $REPOSITORY, it should be deleted."
V_MAIN_EXISTING=${existing_tag/*.} IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
V_SUB_EXISTING=${existing_tag/*.} elif [[ $V_MAIN_EXISTING -lt $V_MAIN ]]; then
echo "Found tag $existing_tag for $REPOSITORY, which is older than the current tag $TAG and should be deleted."
# Not an integer IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
[[ ! $V_MAIN_EXISTING =~ ^[0-9]+$ ]] && continue elif [[ $V_SUB_EXISTING -lt $V_SUB ]]; then
[[ ! $V_SUB_EXISTING =~ ^[0-9]+$ ]] && continue echo "Found tag $existing_tag for $REPOSITORY, which is older than the current tag $TAG and should be deleted."
IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
if [[ $V_MAIN_EXISTING == "latest" ]]; then fi
echo "Found deprecated label \"latest\" for repository $REPOSITORY, it should be deleted." done
IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
elif [[ $V_MAIN_EXISTING -lt $V_MAIN ]]; then
echo "Found tag $existing_tag for $REPOSITORY, which is older than the current tag $TAG and should be deleted."
IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
elif [[ $V_SUB_EXISTING -lt $V_SUB ]]; then
echo "Found tag $existing_tag for $REPOSITORY, which is older than the current tag $TAG and should be deleted."
IMGS_TO_DELETE+=($REPOSITORY:$existing_tag)
fi
done
done done
if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then if [[ ! -z ${IMGS_TO_DELETE[*]} ]]; then
echo "Run the following command to delete unused image tags:" echo "Run the following command to delete unused image tags:"
echo echo
echo " docker rmi ${IMGS_TO_DELETE[*]}" echo " docker rmi ${IMGS_TO_DELETE[*]}"
echo echo
read -r -p "Do you want to delete old image tags right now? [y/N] " response read -r -p "Do you want to delete old image tags right now? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
docker rmi ${IMGS_TO_DELETE[*]} docker rmi ${IMGS_TO_DELETE[*]}
else else
echo "OK, skipped." echo "OK, skipped."
fi fi
fi fi
echo -e "\e[32mFurther cleanup...\e[0m" echo -e "\e[32mFurther cleanup...\e[0m"
echo "If you want to cleanup further garbage collected by Docker, please make sure all containers are up and running before cleaning your system by executing \"docker system prune\"" echo "If you want to cleanup further garbage collected by Docker, please make sure all containers are up and running before cleaning your system by executing \"docker system prune\""