1
0
Fork 0
scripts/ab-openldap/ab-openldap-update.sh

170 lines
5.1 KiB
Bash
Executable File

#!/bin/sh
#
# update script for ab-openldap container and utility scripts
# version 1.0.0
# script by Asif Bacchus
#
### functions
consoleError() {
printf "\n%s%s%s\n\n" "$err" "$2" "$norm"
exit "$1"
}
### text formatting presets
if command -v tput > /dev/null; then
cyan=$(tput setaf 6)
err=$(tput bold)$(tput setaf 1)
norm=$(tput sgr0)
ok=$(tput setaf 2)
yellow=$(tput setaf 11)
else
cyan=''
err=''
norm=''
ok=''
yellow=''
fi
### pre-requisites
# check if wget is installed
if ! command -v wget > /dev/null 2>&1; then
consoleError '1' "Sorry, this script requires that 'wget' is installed in order to automatically update files."
fi
# is user root or in the docker group?
if [ ! "$( id -u )" -eq 0 ]; then
if ! id -Gn | grep docker > /dev/null; then
consoleError '1' "You must either be root or in the 'docker' group to pull container updates."
fi
fi
# zero counters
updatesAvailable=0
downloadFailed=0
downloadSuccess=0
updateFailed=0
updateSuccess=0
# reference constants
containerName='ab-openldap'
containerUpdatePath="docker.asifbacchus.app/ldap/$containerName:latest"
serverPath="https://asifbacchus.app/public/$containerName/"
checksumFilename='checksums.sha256'
# files to update
scriptName="$containerName-update.sh"
updateFiles="$containerName-backup.params.template $containerName-backup.sh $containerName.params.template $containerName.sh"
printf "\n%sUpdating %s%s%s:%s\n" "$cyan" "$yellow" "$containerName" "$cyan" "$norm"
### update container
printf "updating container... "
if ! docker pull "$containerUpdatePath" > /dev/null 2>&1; then
printf "%s[ERROR]\n\n" "$err"
printf "There was a problem updating the container. Please try again later.%s\n\n" "$norm"
exit 1
else
printf "%s[OK]%s\n" "$ok" "$norm"
fi
### checksums
printf "downloading latest checksums... "
if ! wget --quiet --tries=3 --timeout=10 -O "$checksumFilename" "$serverPath$checksumFilename"; then
printf "%s[ERROR]\n\n" "$err"
printf "Unable to download updated checksums. Please try again later.%s\n\n" "$norm"
exit 1
else
printf "%s[OK]%s\n" "$ok" "$norm"
fi
### script self-update
printf "checking for updates to this script... "
localScriptChecksum=$( sha256sum "./$scriptName" | grep -o '^\S*' )
repoScriptChecksum=$( grep "$scriptName" "$checksumFilename" | grep -o '^\S*' )
if [ "$localScriptChecksum" = "$repoScriptChecksum" ]; then
printf "[NONE]\n"
else
# download updated script
if ! wget --quiet --tries=3 --timeout=10 -O "$scriptName" "$serverPath$scriptName"; then
printf "%s[ERROR]\n\n" "$err"
printf "Unable to download script update. Please try again later.%s\n\n" "$norm"
exit 1
else
# verify download
localScriptChecksum=$( sha256sum "$scriptName" | grep -o '^\S*' )
if ! [ "$localScriptChecksum" = "$repoScriptChecksum" ]; then
printf "%s[ERROR]\n\n" "$err"
printf "Unable to verify checksum of updated script. Please try again later.%s\n\n" "$norm"
else
printf "%s[UPDATED]%s\n\n" "$ok" "$norm"
printf "%s*** This script has been updated. Please re-run it to load the updated version of this file. ***%s\n\n" "$yellow" "$norm"
exit 0
fi
fi
fi
## update files
# remember: do NOT quote dummy var!
set -- dummy $updateFiles
shift
for file; do
printf "checking '%s' for updates... " "$file"
repoFileChecksum=$( grep "$file" "$checksumFilename" | grep -o '^\S*' )
if [ -f "$file" ]; then
localFileChecksum=$( sha256sum "$file" | grep -o '^\S*' )
else
localFileChecksum=0
fi
if ! [ "$localFileChecksum" = "$repoFileChecksum" ]; then
printf "%s[AVAILABLE]%s " "$yellow" "$norm"
updatesAvailable=$((updatesAvailable+1))
# download update
if ! wget --quiet --tries=3 --timeout=10 -O "$file" "$serverPath$file"; then
printf "%s[ERROR]%s\n" "$err" "$norm"
downloadFailed=$((downloadFailed+1))
else
printf "%s[DOWNLOADED] %s" "$ok" "$norm"
downloadSuccess=$((downloadSuccess+1))
# verify download
localFileChecksum=$( sha256sum "$file" | grep -o '^\S*' )
if ! [ "$localFileChecksum" = "$repoFileChecksum" ]; then
printf "%s[INVALID]%s\n" "$err" "$norm"
updateFailed=$((updateFailed+1))
else
printf "%s[VERIFIED]%s\n" "$ok" "$norm"
updateSuccess=$((updateSuccess+1))
fi
fi
else
printf "[NONE]\n"
fi
done
### display results
printf "\n%sResults:%s\n" "$cyan" "$norm"
printf "\tUpdates: %s available\n" "$updatesAvailable"
if [ "$updatesAvailable" -gt '0' ]; then
if [ "$downloadFailed" -gt '0' ]; then
printf "\tDownloads: %s successful, %s%s failed%s\n" "$downloadSuccess" "$err" "$downloadFailed" "$norm"
else
printf "\tDownloads: %s successful\n" "$downloadSuccess"
fi
if [ "$updateFailed" -gt '0' ]; then
printf "\tUpdates: %s applied, %s%s failed%s\n\n" "$updateSuccess" "$err" "$updateFailed" "$norm"
else
printf "\tUpdates: %s applied\n\n" "$updateSuccess"
fi
fi
exit 0
#EOF