update_ombi/update_ombi.sh
2018-03-27 19:07:43 -05:00

365 lines
11 KiB
Bash

#!/bin/bash
####################################
## update_ombi systemd script ##
## GitHub: Unimatrix0/update_ombi ##
####################################
####################################
## Override default settings by ##
## creating update_ombi.conf in ##
## the same directory that the ##
## script is running in and set ##
## the required variables there ##
####################################
## The systemd unit for Ombi ##
ombiservicename="ombi"
## The update_ombi log file ##
logfile="/var/log/ombiupdater.log"
####################################
## The remaining variables only ##
## need to be set or overridden ##
## if the script is unable to ##
## parse the ombi.service file ##
## for the correct settings ##
####################################
## !! This should never happen !! ##
####################################
## The service file's full path ##
ombiservicefile="/etc/systemd/system/$ombiservicename.service"
## Ombi install directory ##
defaultinstalldir="/opt/Ombi"
## User and Group Ombi runs as ##
defaultuser="ombi"
defaultgroup="nogroup"
defaultip="127.0.0.1"
defaultport="5000"
## Level of verbosity ##
## By default, none ##
declare -i verbosity=-1
############################################
## Do not modify anything below this line ##
## unless you know what you are doing ##
############################################
name="update_ombi"
version="1.3.00"
SECONDS=0
arch=$(uname -m)
archshort=${arch:0:3}
while [ $# -gt 0 ]; do
case "$1" in
--verbosity|-v=*)
shift
if [[ ${1#*=} =~ ^-?[0-8]$ ]]; then
verbosity="${1#*=}"
else
printf "****************************\n"
printf "* Error: Invalid verbosity.*\n"
printf "****************************\n"
exit 1
fi
;;
--force|-f=*)
shift
if [[ ${1#*=} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
force="${1#*=}"
else
printf "****************************\n"
printf "* Error: Invalid version. *\n"
printf "****************************\n"
exit 1
fi
;;
*)
printf "****************************\n"
printf "* Error: Invalid argument. *\n"
printf "****************************\n"
exit 1
esac
shift
done
declare -A LOG_LEVELS=([-1]="none" [0]="emerg" [1]="alert" [2]="crit" [3]="err" [4]="warning" [5]="notice" [6]="info" [7]="debug" [8]="trace")
function .log () {
local LEVEL=${1}
shift
if [[ $verbosity =~ ^-?[0-8]$ ]]; then
if [ $verbosity -ge $LEVEL ]; then
echo "[$(date '+%H:%M:%S')] [${LOG_LEVELS[$LEVEL]}]" "$@"
fi
fi
if [ $verbosity -eq 8 ] || [ $LEVEL -ne 8 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S %Z' -u)] [${LOG_LEVELS[$LEVEL]}]" "$@" >> $logfile
fi
}
unzip-strip() (
local zip=$1
local dest=${2:-.}
local temp=$(mktemp -d) && tar -zxf "$zip" -C "$temp" && mkdir -p "$dest" &&
shopt -s dotglob && local f=("$temp"/*) &&
if (( ${#f[@]} == 1 )) && [[ -d "${f[0]}" ]] ; then
cp -r "$temp"/*/* "$dest"
else
cp -r "$temp"/* "$dest"
fi && rm -rf "${temp:?}"/* "$temp"
)
# Import any custom config to override the defaults, if necessary
configfile="$(dirname $0)/update_ombi.conf"
if [ -e $configfile ]; then
source $configfile > /dev/null 2>&1
.log 6 "Script config file found...parsing..."
if [ $? -ne 0 ] ; then
.log 3 "Unable to use config file...using defaults..."
else
.log 6 "Parsed config file"
fi
else
.log 6 "No config file found...using defaults..."
fi
.log 6 "$name v$version"
.log 6 "Verbosity level: [${LOG_LEVELS[$verbosity]}]"
scriptuser=$(whoami)
.log 7 "Update script running as: $scriptuser"
if [ -e $ombiservicefile ]; then
.log 6 "Ombi service file for systemd found...parsing..."
parseresults="Parsing complete: "
ombiservice=$(<$ombiservicefile)
installdir=$(grep -Po '(?<=WorkingDirectory=)(\S|(?<=\\)\s)+' <<< "$ombiservice")
if [ -n "${installdir}" ]; then
parseresults+="InstallDir: $installdir, "
fi
user=$(grep -Po '(?<=User=)(\w+)' <<< "$ombiservice")
if [ -n "${user}" ]; then
parseresults+="User: $user, "
fi
group=$(grep -Po '(?<=Group=)(\w+)' <<< "$ombiservice")
if [ -n "${group}" ]; then
parseresults+="Group: $group, "
fi
url=$(grep -Po '(?<=\-\-host )(http://.+)$' <<< "$ombiservice")
ip=$(grep -Po '(?<=http://)((\d{1,3}\.){3}\d{1,3})(?=:)' <<< "$url")
if [ -n "${ip}" ]; then
parseresults+="IP: $ip, "
fi
port=$(grep -Po '(?<=:)(\d+)$' <<< "$url")
if [ -n "${port}" ]; then
parseresults+="Port: $port "
fi
parseresults="${parseresults// / }"
parseresults="${parseresults/%, /}"
.log 6 "$parseresults"
fi
if [ -z "${installdir}" ]; then
.log 5 "InstallDir not parsed...setting to default: $defaultinstalldir"
installdir="$defaultinstalldir"
fi
if [ -z "${user}" ]; then
.log 5 "User not parsed...setting to default: $defaultuser"
user="$defaultuser"
fi
if [ -z "${group}" ]; then
.log 5 "Group not parsed...setting to default: $defaultgroup"
group="$defaultgroup"
fi
if [ -z "${ip}" ]; then
.log 5 "IP not parsed or set as \"*\"...setting to default: $defaultip"
ip="$defaultip"
fi
if [ -z "${port}" ]; then
.log 5 "Port not parsed...setting to default: $defaultport"
port="$defaultport"
fi
.log 6 "Downloading Ombi update..."
if [ "$archshort" = 'arm' ]; then
filename='linux-arm.tar.gz'
else
filename='linux.tar.gz'
fi
declare -i i=1
declare -i j=5
while [ $i -le $j ]
do
.log 6 "Checking for latest version"
json=$(curl -sL http://$ip:$port/api/v1/Update/develop)
.log 8 "json: $json"
latestversion=$(grep -Po '(?<="updateVersionString":")([^"]+)' <<< "$json")
.log 7 "latestversion: $latestversion"
if [ -n "$force" ]; then
latestversion=$force
.log 7 "forcing version: $latestversion"
fi
json=$(curl -sL https://ci.appveyor.com/api/projects/tidusjar/requestplex/build/$latestversion)
.log 8 "json: $json"
jobId=$(grep -Po '(?<="jobId":")([^"]+)' <<< "$json")
.log 7 "jobId: $jobId"
version=$(grep -Po '(?<="version":")([^"]+)' <<< "$json")
.log 7 "version: $version"
if [ $latestversion != $version ]; then
.log 2 "Build version does not match expected version"
exit 1
fi
.log 6 "Latest version: $version...determining expected file size..."
size=$(curl -sL https://ci.appveyor.com/api/buildjobs/$jobId/artifacts | grep -Po '(?<="'$filename'","type":"File","size":)(\d+)')
.log 7 "size: $size"
if [ -e $size ]; then
if [ $i -lt $j ]; then
.log 3 "Unable to determine update file size...[attempt $i of $j]"
else
.log 2 "Unable to determine update file size...[attempt $i of $j]...Bailing!"
exit 2
fi
i+=1
continue
elif [[ $size =~ ^-?[0-9]+$ ]]; then
.log 6 "Expected file size: $size...downloading..."
break
else
.log 1 "Invalid file size value...bailing!"
exit 99
fi
done
tempdir=$(mktemp -d)
file="$tempdir/ombi_$version.tar.gz"
wget --quiet --show-progress -O $file "https://ci.appveyor.com/api/buildjobs/$jobId/artifacts/$filename"
.log 6 "Version $version downloaded...checking file size..."
if [ "$(wc -c < $file)" != $size ]; then
.log 3 "Downloaded file size does not match expected file size...bailing!"
exit 2
fi
.log 6 "File size validated...checking Ombi service status..."
declare -i running=0
if [ "`systemctl is-active $ombiservicename`" == "active" ]; then
running=1
.log 6 "Ombi is active...attempting to stop..."
declare -i i=1
declare -i j=5
while [ $i -le $j ]
do
if [ $scriptuser = "root" ]; then
systemctl stop $ombiservicename.service > /dev/null 2>&1
else
sudo systemctl stop $ombiservicename.service > /dev/null 2>&1
fi
if [ $? -ne 0 ] || [ "`systemctl is-active $ombiservicename`" == "active" ] ; then
if [ $i -lt $j ]; then
.log 3 "Failed to stop Ombi...[attempt $i of $j]"
sleep 1
else
.log 2 "Failed to stop Ombi...[attempt $i of $j]...Bailing!"
exit 2
fi
i+=1
continue
elif [ "`systemctl is-active $ombiservicename`" == "inactive" ]; then
.log 6 "Ombi stopped...installing update..."
break
else
.log 1 "Unknown error...bailing!"
exit 99
fi
done
else
.log 6 "Ombi is not active...installing update..."
fi
declare -i timestamp=$(date +%s)
.log 6 "Backing up Ombi.db to Ombi.db.$timestamp"
cp ${installdir}Ombi.db ${installdir}Ombi.db.$timestamp
unzip-strip $file $installdir
.log 6 "Update installed...setting ownership..."
chown -R $user:$group $installdir
if [ $running -eq 1 ]; then
.log 6 "Ownership set...starting Ombi..."
declare -i i=1
declare -i j=5
while [ $i -le $j ]
do
if [ $scriptuser = "root" ]; then
systemctl start $ombiservicename.service > /dev/null 2>&1
else
sudo systemctl start $ombiservicename.service > /dev/null 2>&1
fi
if [ $? -ne 0 ] || [ "`systemctl is-active $ombiservicename`" != "active" ] ; then
if [ $i -lt $j ]; then
.log 3 "Failed to start Ombi...[attempt $i of $j]"
sleep 1
else
.log 2 "Failed to start Ombi...[attempt $i of $j]...Bailing!"
exit 3
fi
i+=1
continue
elif [ "`systemctl is-active $ombiservicename`" == "active" ]; then
.log 6 "Ombi started...waiting for confirmation..."
declare -i k=1
declare -i l=5
while [ $k -le $l ]
do
sleep 5
curl -sIL $ip:$port > /dev/null 2>&1
if [ $? -ne 0 ]; then
if [ $k -lt $l ]; then
.log 4 "Ombi startup not confirmed...waiting 5 seconds...[attempt $k of $l]"
else
.log 2 "Ombi startup not confirmed...[attempt $k of $l]...bailing!"
exit 4
fi
k+=1
continue
else
.log 6 "Ombi startup confirmed...cleaning up..."
break
fi
done
break
else
.log 1 "Unknown error...bailing!"
exit 99
fi
done
else
.log 6 "Ownership set...not starting Ombi"
fi
.log 6 "Cleaning up..."
rm -rf "${tempdir:?}"/* "$tempdir"
declare -i elapsedtime=$SECONDS
declare -i minutes=0
declare -i seconds=0
if [ $elapsedtime -ge 60 ]; then
minutes=$(($elapsedtime / 60))
fi
seconds=$(($elapsedtime % 60))
if [ $minutes -ge 2 ]; then
duration="$minutes minutes"
elif [ $minutes -eq 1 ]; then
duration="$minutes minute"
fi
if [ $seconds -ge 2 ]; then
duration+=" $seconds seconds"
elif [ $seconds -eq 1 ]; then
duration+=" $seconds second"
fi
durationmsg="Update complete...elapsed time $duration..."
durationmsg="${durationmsg// / }"
.log 6 "$durationmsg"