From 0dbbd960e5e5f3be2efc8df8d9ab923b63b3b0a4 Mon Sep 17 00:00:00 2001 From: Avi Date: Sat, 28 Oct 2017 18:38:19 -0500 Subject: [PATCH] Logging/log levels, fix build selection, sudo fix Added logging to file. Added log levels. Added command line parameter (-v) to set cli log verbosity. Reworked update download section to account for if latest build is in progress or failed. Allowed for script to run as user with restricted sudo access to stop/start ombi service --- update_ombi.sh | 177 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 127 insertions(+), 50 deletions(-) diff --git a/update_ombi.sh b/update_ombi.sh index c75aa95..4358a8c 100644 --- a/update_ombi.sh +++ b/update_ombi.sh @@ -6,35 +6,43 @@ ombiservicename="ombi" ## Default variables ## ## Change only if needed ## +logfile="/var/log/ombiupdater.log" ombiservicefile="/etc/systemd/system/$ombiservicename.service" defaultinstalldir="/opt/Ombi" defaultuser="ombi" defaultgroup="nogroup" +declare -i verbosity=-1 ## Do not modify anything below this line ## ## unless you know what you are doing ## -if [ -e $ombiservicefile ]; then - echo "Ombi service file for systemd found...parsing..." - ombiservice=$(<$ombiservicefile) - installdir=$(grep -Po '(?<=WorkingDirectory=)(\S|(?<=\\)\s)+' <<< "$ombiservice") - user=$(grep -Po '(?<=User=)(\w+)' <<< "$ombiservice") - group=$(grep -Po '(?<=Group=)(\w+)' <<< "$ombiservice") - echo "Parsing complete: InstallDir: $installdir, User: $user, Group: $group" -fi +while [ $# -gt 0 ]; do + case "$1" in + --verbosity|-v=*) + verbosity="${1#*=}" + ;; + *) + printf "***************************\n" + printf "* Error: Invalid argument.*\n" + printf "***************************\n" + exit 1 + esac + shift +done -if [ -z ${installdir+x} ]; then - echo "InstallDir not parsed...setting to default: $defaultinstalldir" - installdir="$defaultinstalldir" -fi -if [ -z ${user+x} ]; then - echo "User not parsed...setting to default: $defaultuser" - user="$defaultuser" -fi -if [ -z ${group+x} ]; then - echo "Group not parsed...setting to default: $defaultgroup" - group="$defaultgroup" -fi +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 "[${LOG_LEVELS[$LEVEL]}]" "$@" + fi + fi + if [ $verbosity -eq 8 ] || [ $LEVEL -ne 8 ]; then + echo "[${LOG_LEVELS[$LEVEL]}]" "$@" >> $logfile + fi +} unzip-strip() ( local zip=$1 @@ -48,82 +56,151 @@ unzip-strip() ( fi && rm -rf "$temp"/* "$temp" ) -echo "Downloading Ombi update..." -json=$(curl -sL https://ci.appveyor.com/api/projects/tidusjar/requestplex) -jobId=$(grep -Po '(?<="jobId":")([^"]+)' <<< "$json") -version=$(grep -Po '(?<="version":")([^"]+)' <<< "$json") -file=ombi_$version.tar.gz -size=$(curl -sL https://ci.appveyor.com/api/buildjobs/$jobId/artifacts | grep -Po '(?<="linux.tar.gz","type":"File","size":)(\d+)') -wget --quiet -O $file https://ci.appveyor.com/api/buildjobs/$jobId/artifacts/linux.tar.gz -echo "Version $version downloaded...checking file size..." -if [ $(wc -c < $file) != $size ]; then - echo "Downloaded file size does not match expected file size...bailing!" - exit 1 +.log 6 "Verboity 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..." + ombiservice=$(<$ombiservicefile) + installdir=$(grep -Po '(?<=WorkingDirectory=)(\S|(?<=\\)\s)+' <<< "$ombiservice") + user=$(grep -Po '(?<=User=)(\w+)' <<< "$ombiservice") + group=$(grep -Po '(?<=Group=)(\w+)' <<< "$ombiservice") + .log 6 "Parsing complete: InstallDir: $installdir, User: $user, Group: $group" fi -echo "File size validated...checking Ombi service status..." + +if [ -z ${installdir+x} ]; then + .log 5 "InstallDir not parsed...setting to default: $defaultinstalldir" + installdir="$defaultinstalldir" +fi +if [ -z ${user+x} ]; then + .log 5 "User not parsed...setting to default: $defaultuser" + user="$defaultuser" +fi +if [ -z ${group+x} ]; then + .log 5 "Group not parsed...setting to default: $defaultgroup" + group="$defaultgroup" +fi + +.log 6 "Downloading Ombi update..." +declare -i i=1 +declare -i j=5 +while [ $i -le $j ] +do + .log 6 "Checking for latest version" + json=$(curl -sL https://ombiservice.azurewebsites.net/api/update/DotNetCore) + .log 8 "json: $json" + latestversion=$(grep -Po '(?<="updateVersionString":")([^"]+)' <<< "$json") + .log 7 "latestversion: $latestversion" + 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 '(?<="linux.tar.gz","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 -O $file "https://ci.appveyor.com/api/buildjobs/$jobId/artifacts/linux.tar.gz" +.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 - echo "Ombi is active...attempting to stop..." + .log 6 "Ombi is active...attempting to stop..." declare -i i=1 j=5 while [ $i -le $j ] do - systemctl stop $ombiservicename.service > /dev/null 2>&1 + 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 - echo "Failed to stop Ombi...[attempt $i of $j]" + .log 3 "Failed to stop Ombi...[attempt $i of $j]" else - echo "Failed to stop Ombi...[attempt $i of $j]...Bailing!" + .log 2 "Failed to stop Ombi...[attempt $i of $j]...Bailing!" exit 2 fi i+=1 continue elif [ "`systemctl is-active $ombiservicename`" == "inactive" ]; then - echo "Ombi stopped...installing update..." + .log 6 "Ombi stopped...installing update..." break else - echo "Unknown error...bailing!" + .log 1 "Unknown error...bailing!" exit 99 fi done else - echo "Ombi is not active...installing update..." + .log 6 "Ombi is not active...installing update..." fi unzip-strip $file $installdir -echo "Update installed...setting ownership..." +.log 6 "Update installed...setting ownership..." chown -R $user:$group $installdir if [ $running -eq 1 ]; then - echo "Ownership set...starting Ombi..." + .log 6 "Ownership set...starting Ombi..." declare -i i=1 j=5 while [ $i -le $j ] do - systemctl start $ombiservicename.service > /dev/null 2>&1 + if [ $scriptuser = "root" ]; then + systemctl 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 - echo "Failed to start Ombi...[attempt $i of $j]" + .log 3 "Failed to start Ombi...[attempt $i of $j]" else - echo "Failed to start Ombi...[attempt $i of $j]...Bailing!" + .log 2 "Failed to start Ombi...[attempt $i of $j]...Bailing!" exit 3 fi i+=1 continue elif [ "`systemctl is-active $ombiservicename`" == "active" ]; then - echo "Ombi started...cleaning up..." + .log 6 "Ombi started...cleaning up..." break else - echo "Unknown error...bailing!" + .log 1 "Unknown error...bailing!" exit 99 fi done else - echo "Ownership set...not starting Ombi" + .log 6 "Ownership set...not starting Ombi" fi -echo "Cleaning up..." -rm -f $file -echo "Update complete" +.log 6 "Cleaning up..." +rm -rf "$tempdir"/* "$tempdir" +.log 6 "Update complete" \ No newline at end of file