final patches
- Fixed issue where removing and recreating pm2 processes resulted in pm2 ID changing after some time. Script now uses the process name even if the user configures it using process ID. - (does require you to go through configuration again to avoid this issue) - Fixed issue where running the script from within the bot folder resulted in profittrailer.jar being deleted. - script can be run without having to cd to the correct directory (i.e /var/opt/linux-update.sh is fine) - Script will self update now. (note that if you are updating to a version which does not come with the updated script you will be downgrading the config and need to manually upgrade again) - Cleaned up code. Deleted a bunch of lines simplifying duplicate sections - fixed inability to handle filenames with spaces - fixed inability to handle script name with spaces - Automatically remove old updatescript backups (keep latest 5 only)
This commit is contained in:
parent
844452a623
commit
7aac84905c
229
update.sh
229
update.sh
|
@ -1,7 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
### Linux .jar Update Script for ProfitTrailer
|
||||
### LAST UPDATED 10 Feb 2019
|
||||
### LAST UPDATED 11 Feb 2019
|
||||
|
||||
### Place this script in the root folder where all your individual bot folders are and then execute it.
|
||||
### For simplicity each ProfitTrailer.jar file should be nested exactly one subfolder.
|
||||
|
@ -10,16 +10,15 @@
|
|||
### /opt
|
||||
### /btc bot
|
||||
### /eth bot
|
||||
### update.sh
|
||||
### When prompted for the directory you can then jsut type "btc bot" or "eth bot" for example.
|
||||
### linux-update.sh
|
||||
### cd to the directory you have it in e.g cd /var/opt
|
||||
### execute using ./update.sh to downlaod the latest github release
|
||||
### execute using ./update.sh https://cdn.discordapp.com/exampleurlonly/ProfitTrailer-2.0.4-B1.jar.zip to download a beta version from a link
|
||||
### execute using ./linux-update.sh to downlaod the latest github release
|
||||
### execute using ./linux-update.sh https://cdn.discordapp.com/exampleurlonly/ProfitTrailer-2.0.4-B1.jar.zip to download a beta version from a link
|
||||
### the link must contain the "ProfitTrailer-2.0.4-B1.jar.zip" portion to work though the ".jar" and "-B#" can be missing.
|
||||
|
||||
###Get the Directory and filename of the script###
|
||||
DIR="$(dirname $(readlink -f $0))"
|
||||
script="$(basename $0)"
|
||||
DIR=$(dirname "$(readlink -f "$0")")
|
||||
script=$(basename "$0")
|
||||
|
||||
### Clear screen and print header
|
||||
clear
|
||||
|
@ -29,12 +28,14 @@ echo " ProfitTrailer Update Script "
|
|||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
|
||||
### INSTALL DEPENDENCIES ###
|
||||
|
||||
### Check if unzip is installed ###
|
||||
if ! [ -x "$(command -v unzip)" ]; then
|
||||
read -p "Unzip is not installed, Do you wish to install it (Y/N)? : " install
|
||||
|
||||
### install unzip if the user wants to proceed ###
|
||||
if [[ "$install" == "y" ]] || [[ "$install" == "Y" ]]; then
|
||||
if [[ $install == "y" ]] || [[ $install == "Y" ]]; then
|
||||
sudo apt install unzip
|
||||
|
||||
if ! [ -x "$(command -v unzip)" ]; then
|
||||
|
@ -58,7 +59,7 @@ if ! [ -x "$(command -v curl)" ]; then
|
|||
read -p "Curl is not installed, Do you wish to install it (Y/N)? : " install
|
||||
|
||||
### install curl if the user wants to proceed ###
|
||||
if [[ "$install" == "y" ]] || [[ "$install" == "Y" ]]; then
|
||||
if [[ $install == "y" ]] || [[ $install == "Y" ]]; then
|
||||
sudo apt install curl
|
||||
|
||||
if ! [ -x "$(command -v curl)" ]; then
|
||||
|
@ -77,8 +78,7 @@ if ! [ -x "$(command -v curl)" ]; then
|
|||
fi
|
||||
fi
|
||||
|
||||
### Set loc variable to No, If user ends up running this script from within a Bot folder we wont delete their jar file ###
|
||||
loc=N
|
||||
### LOAD PREVIOUS CONFIG ###
|
||||
|
||||
### If no previous config can be found enter setup automatically ###
|
||||
if [ ! -f "$DIR"/updatescript/name.txt ]; then
|
||||
|
@ -106,12 +106,11 @@ else
|
|||
continue
|
||||
else
|
||||
echo "$(tput setaf 1)Path for instance $i does no exist. Setup required. $(tput sgr0)"
|
||||
echo
|
||||
skipsetup=N
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ! "$skipsetup" == "N" ]]; then
|
||||
if [[ ! $skipsetup == "N" ]]; then
|
||||
### print out the arrays as a table for user to check ###
|
||||
### pad the columns by 8 places for legibility ###
|
||||
echo "$(tput setaf 6)Your current configuration is: $(tput sgr0)"
|
||||
|
@ -121,22 +120,20 @@ else
|
|||
fi
|
||||
fi
|
||||
|
||||
### SETUP ###
|
||||
|
||||
if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
||||
if [[ $skipsetup == "n" ]] || [[ $skipsetup == "N" ]]; then
|
||||
|
||||
### Set proceed variable to No, causing loop unitil user confirms proceed later ###
|
||||
proceed=N
|
||||
|
||||
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Setup"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
echo
|
||||
|
||||
|
||||
while [[ "$proceed" == "N" ]] || [[ "$proceed" == "n" ]]; do
|
||||
while [[ $proceed == "N" ]] || [[ $proceed == "n" ]]; do
|
||||
### wipe arrays clean then set the header for each array ###
|
||||
name=()
|
||||
path=()
|
||||
|
@ -153,12 +150,11 @@ if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
|||
### use the lack of profittrailer.jar to loop through setup.
|
||||
while [[ ! -f "${path[$i]}"/ProfitTrailer.jar ]]; do
|
||||
read -p "What is the PM2 App name/ id for instance $i? " newname
|
||||
chars="a-zA-Z0-9_\/-"
|
||||
re="\/[$chars]+"
|
||||
execpath=$(pm2 info "$newname" | grep 'exec cwd');
|
||||
if [[ $execpath =~ $re ]]; then
|
||||
path[$i]=$BASH_REMATCH
|
||||
fi
|
||||
### use grep, sed and cut to find the field the pm2 process path is in. Future PM2 updates might break this and need changing ###
|
||||
rename=$(pm2 info "$newname" | grep 'exec cwd' | sed -n '1p' | cut -d '/' -f 2-)
|
||||
### remove any leading or trailing spaces or tabs and also column bars from pm2 output by reversing and cutting ###
|
||||
nowhitespace=$(echo "$rename" | xargs | rev | cut -d ' ' -f 2- | rev )
|
||||
path[$i]=/"$nowhitespace"
|
||||
|
||||
### if user entered only a number (pm2 ID) store the app name instead. ###
|
||||
### dunno why but if you alter the below echo and then structure it literally breaks the if statement ###
|
||||
|
@ -172,13 +168,13 @@ if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
|||
name[$i]=$nowhitespace
|
||||
fi
|
||||
|
||||
### If the directory provided doesnt exist or nothing is entered, ask again ###
|
||||
### If no directory exists for the given pm2 process or nothing is entered, ask again ###
|
||||
if [[ ! -d "${path[$i]}" ]] || [[ -z "${path[$i]}" ]]; then
|
||||
echo "$(tput setaf 1)Path for instance $i does not exist. Try again... $(tput sgr0)"
|
||||
### If the directory does not contain the ProfitTrailer.jar file, confirm intentions ###
|
||||
elif [[ ! -f "${path[$i]}"/ProfitTrailer.jar ]]; then
|
||||
read -p "$(tput setaf 1)Path for instance $i (${path[$i]}) does not contain ProfitTrailer.jar. Do you wish to use it anyway? (Y/N) $(tput sgr0)" empty
|
||||
if [[ "$empty" == "y" ]] || [[ "$empty" == "Y" ]] || [[ "$empty" == "yes" ]] || [[ "$empty" == "Yes" ]]; then
|
||||
if [[ $empty == "y" ]] || [[ $empty == "Y" ]] || [[ $empty == "yes" ]] || [[ $empty == "Yes" ]]; then
|
||||
break
|
||||
fi
|
||||
fi
|
||||
|
@ -187,7 +183,6 @@ if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
|||
|
||||
### print out the arrays as a table for user to check ###
|
||||
### %-8s pads the columns to make it appear correctly ###
|
||||
echo
|
||||
echo "$(tput setaf 6)The configuration entered is: $(tput sgr0)"
|
||||
paste <(printf "%-8s\n" "${name[@]}") <(printf "%-8s\n" "${path[@]}")
|
||||
echo
|
||||
|
@ -195,25 +190,25 @@ if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
|||
echo
|
||||
|
||||
### If something else is entered ask for a new answer ###
|
||||
while [[ ! "$proceed" == "y" ]] && [[ ! "$proceed" == "Y" ]] && [[ ! "$proceed" == "n" ]] && [[ ! "$proceed" == "N" ]]; do
|
||||
while [[ ! $proceed == "y" ]] && [[ ! $proceed == "Y" ]] && [[ ! $proceed == "n" ]] && [[ ! $proceed == "N" ]]; do
|
||||
echo Please Try Again...
|
||||
read -p "Is this correct? (Y/N) " proceed
|
||||
echo
|
||||
done
|
||||
|
||||
|
||||
if [[ "$proceed" == "Y" ]] || [[ "$proceed" == "y" ]]; then
|
||||
if [[ $proceed == "Y" ]] || [[ $proceed == "y" ]]; then
|
||||
### optional step to save the setup for next time ###
|
||||
read -p "Do you wish to save this setup? (Y/N) " savetofile
|
||||
|
||||
### If something else is entered ask for a new answer ###
|
||||
while [[ ! "$savetofile" == "y" ]] && [[ ! "$savetofile" == "Y" ]] && [[ ! "$savetofile" == "n" ]] && [[ ! "$savetofile" == "N" ]]; do
|
||||
while [[ ! $savetofile == "y" ]] && [[ ! $savetofile == "Y" ]] && [[ ! $savetofile == "n" ]] && [[ ! $savetofile == "N" ]]; do
|
||||
echo Please Try Again...
|
||||
read -p "Do you wish to save this setup? (Y/N) " savetofile
|
||||
echo
|
||||
done
|
||||
|
||||
if [[ "$savetofile" == "Y" ]] || [[ "$savetofile" == "y" ]]; then
|
||||
if [[ $savetofile == "Y" ]] || [[ $savetofile == "y" ]]; then
|
||||
### create the folder for the config if necessary ###
|
||||
mkdir -p "$DIR"/updatescript
|
||||
### print each array to a file, one element per row ###
|
||||
|
@ -234,35 +229,49 @@ if [[ "$skipsetup" == "n" ]] || [[ "$skipsetup" == "N" ]]; then
|
|||
fi
|
||||
done
|
||||
|
||||
elif [[ ! "$skipsetup" == "y" ]] && [[ ! "$skipsetup" == "Y" ]]; then
|
||||
elif [[ ! $skipsetup == "y" ]] && [[ ! $skipsetup == "Y" ]]; then
|
||||
echo $(tput setaf 1)
|
||||
echo Process Aborted....
|
||||
echo $(tput sgr0)
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ ! $1 ]]; then
|
||||
### Find Latest Version of PT and its download url ###
|
||||
version=$(curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep tag_name | cut -d '"' -f 4 | sed -n '1p')
|
||||
download=$(curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep browser_download_url | cut -d '"' -f 4 | sed -n '1p')
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Update"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
echo "Latest release is version $(tput setaf 6) $version $(tput sgr0)"
|
||||
echo
|
||||
read -p "Do you want to continue? (Y/N) " continue
|
||||
echo
|
||||
### DOWNLOAD AND INSTALL ###
|
||||
|
||||
### If something else is entered ask for a new answer ###
|
||||
while [[ ! "$continue" == "y" ]] && [[ ! "$continue" == "Y" ]] && [[ ! "$continue" == "n" ]] && [[ ! "$continue" == "N" ]]; do
|
||||
|
||||
### passing a Beta URL as a variable will use the url itself to determine version###
|
||||
### the only difference is it will strip out the -Bx from the jar file name
|
||||
### e.g ./update.sh https://cdn.discordapp.com/attachments/400383734777511936/443897522956533760/ProfitTrailer-2.0.4-B1.jar.zip
|
||||
|
||||
### extract the version number from the file name ###
|
||||
version=$(echo $1 | rev | cut -d'/' -f 1 | rev | sed 's/\(.*\).zip/\1/' | sed 's/\(.*\).jar/\1/' | rev | sed 's/\(.*\)-reliarTtiforP/\1/' | rev)
|
||||
download=$1
|
||||
|
||||
### If no variable is passed search on github ###
|
||||
if [[ ! $1 ]]; then
|
||||
### Find Latest Version of PT and its download url ###
|
||||
version=$(curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep tag_name | cut -d '"' -f 4 | sed -n '1p')
|
||||
download=$(curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep browser_download_url | cut -d '"' -f 4 | sed -n '1p')
|
||||
fi
|
||||
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Update"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
echo "Latest release is version $(tput setaf 6) $version $(tput sgr0)"
|
||||
echo
|
||||
read -p "Do you want to continue? (Y/N) " continue
|
||||
echo
|
||||
|
||||
### If something else is entered ask for a new answer ###
|
||||
while [[ ! $continue == "y" ]] && [[ ! $continue == "Y" ]] && [[ ! $continue == "n" ]] && [[ ! $continue == "N" ]]; do
|
||||
echo Please Try Again...
|
||||
read -p "Do you want to continue? (Y/N) " continue
|
||||
echo
|
||||
done
|
||||
done
|
||||
|
||||
if [[ "$continue" == "y" ]] || [[ "$continue" == "Y" ]]; then
|
||||
if [[ $continue == "y" ]] || [[ $continue == "Y" ]]; then
|
||||
|
||||
### Download & extract latest version of PT ###
|
||||
echo
|
||||
|
@ -273,14 +282,18 @@ if [[ ! $1 ]]; then
|
|||
echo "$(tput setaf 2) === Extracting download === $(tput sgr0)"
|
||||
### unzip the jar file only from the zip. -q for quiet, -j to prevent extracting directories ###
|
||||
unzip -q -j ProfitTrailer-$version.zip '*jar' '*sh'
|
||||
### Update linux-update script ###
|
||||
mv linux-update.sh "$DIR"/"$script"
|
||||
chmod +x "$DIR"/"$script"
|
||||
|
||||
### Set loc variable to No, If user ends up running this script from within a Bot folder we wont delete their jar file ###
|
||||
loc=N
|
||||
|
||||
### Stop each BOT and Copy ProfitTrailer.jar to each instance, then restart it ###
|
||||
for ((i=1; i<=PTinstances; i++)); do
|
||||
|
||||
### If the user is running this script inside their bots folder we avoid deleting the jar during cleanup ###
|
||||
if [[ "$DIR" == "${path[$i]}" ]]; then
|
||||
if [[ $DIR == "${path[$i]}" ]]; then
|
||||
loc=Y
|
||||
fi
|
||||
|
||||
|
@ -301,105 +314,31 @@ if [[ ! $1 ]]; then
|
|||
echo
|
||||
echo "$(tput setaf 2) === Cleaning up === $(tput sgr0)"
|
||||
|
||||
if [[ "$loc" == "Y" ]]; then
|
||||
if [[ $loc == "Y" ]]; then
|
||||
rm -rf ProfitTrailer-$version*.zip
|
||||
else
|
||||
rm -rf ProfitTrailer-$version*.zip ProfitTrailer.jar
|
||||
fi
|
||||
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Finished updating to ProfitTrailer $version"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
|
||||
### Present summary of pm2 at the end ###
|
||||
pm2 status
|
||||
echo
|
||||
else
|
||||
echo $(tput setaf 1)
|
||||
echo Process Aborted....
|
||||
echo $(tput sgr0)
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
|
||||
### passing a Beta URL as a variable will initiate this installation process instead###
|
||||
### the only difference is it will strip out the -B1 from the jar file name
|
||||
### e.g ./update.sh https://cdn.discordapp.com/attachments/400383734777511936/443897522956533760/ProfitTrailer-2.0.4-B1.jar.zip
|
||||
if [ -n "${1}" ]; then
|
||||
|
||||
### extract the version number from the file name ###
|
||||
version=$(echo $1 | rev | cut -d'/' -f 1 | rev | sed 's/\(.*\).zip/\1/' | sed 's/\(.*\).jar/\1/' | rev | sed 's/\(.*\)-reliarTtiforP/\1/' | rev)
|
||||
|
||||
echo
|
||||
echo "This Release is version $(tput setaf 6) $version $(tput sgr0)"
|
||||
read -p "Do you want to continue? (Y/N) " continue
|
||||
if [[ "$continue" == "y" ]] || [[ "$continue" == "Y" ]]; then
|
||||
|
||||
### Download & extract latest version of PT ###
|
||||
echo
|
||||
echo "$(tput setaf 2) === Downloading ProfitTrailer $version === $(tput sgr0)"
|
||||
### -q for quiet to minimise output but --show-progress to give us a progress bar ###
|
||||
curl $1 -L -O --progress-bar
|
||||
echo
|
||||
echo "$(tput setaf 2) === Extracting download === $(tput sgr0)"
|
||||
### unzip the jar file only from the zip. -q for quiet, -j to prevent extracting directories ###
|
||||
unzip -q -j ProfitTrailer-$version.zip '*jar' '*sh'
|
||||
mv linux-update.sh "$DIR"/"$script"
|
||||
|
||||
### Copy ProfitTrailer.jar to each instance ###
|
||||
for ((i=1; i<=PTinstances; i++)); do
|
||||
|
||||
### If the user is running this script inside their bots folder we avoid deleting the jar during cleanup ###
|
||||
if [[ "$DIR" == "${path[$i]}" ]]; then
|
||||
loc=Y
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "$(tput setaf 2) === Stopping ${name[$i]} === $(tput sgr0)"
|
||||
pm2 stop "${name[$i]}"
|
||||
echo
|
||||
echo "$(tput setaf 2) === Replacing jar file === $(tput sgr0)"
|
||||
cp ProfitTrailer*.jar "${path[$i]}"/ProfitTrailer.jar
|
||||
mkdir -p "$DIR"/updatescript/"$(date +%m%d_%H%M)"/"${name[$i]}"
|
||||
cp "${path[$i]}"/data/ptdb.mv.db "$DIR"/updatescript/"$(date +%m%d_%H%M)"/"${name[$i]}"/ptdb.mv.db
|
||||
echo
|
||||
echo "$(tput setaf 2) === Restarting ${name[$i]} === $(tput sgr0)"
|
||||
pm2 reload "${name[$i]}"
|
||||
echo
|
||||
done
|
||||
|
||||
### Remove downloaded Files ###
|
||||
echo "$(tput setaf 2) === Cleaning up === $(tput sgr0)"
|
||||
|
||||
if [[ "$loc" == "Y" ]]; then
|
||||
rm -rf ProfitTrailer-$version*.zip
|
||||
else
|
||||
rm -rf ProfitTrailer-$version*.zip ProfitTrailer*.jar
|
||||
fi
|
||||
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Finished updating to ProfitTrailer $version"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
|
||||
### Present summary of pm2 at the end ###
|
||||
pm2 status
|
||||
echo
|
||||
else
|
||||
echo $(tput setaf 1)
|
||||
echo Process Aborted....
|
||||
echo $(tput sgr0)
|
||||
exit
|
||||
fi
|
||||
fi
|
||||
|
||||
### Remove all but the 5 most recent backups ###
|
||||
if [ "$(ls -ld $DIR/updatescript/* | wc -l)" -gt 5 ]
|
||||
then
|
||||
ls -dt "$DIR"/updatescript/*/ | tail -n +6 | xargs rm -r
|
||||
### Remove all but the 5 most recent backups ###
|
||||
if [ "$(ls -ld "$DIR"/updatescript/* | wc -l)" -gt 5 ]
|
||||
then
|
||||
ls -dt "$DIR"/updatescript/*/ | tail -n +6 | xargs -d "\n" rm -r
|
||||
echo "Removed old backups from updatescript folder."
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $(tput setaf 3)
|
||||
echo "##################################################"
|
||||
echo " Finished updating to ProfitTrailer $version"
|
||||
echo "##################################################"
|
||||
echo $(tput sgr0)
|
||||
|
||||
### Present a summary of pm2 at the end ###
|
||||
pm2 status
|
||||
echo
|
||||
else
|
||||
echo $(tput setaf 1)
|
||||
echo Process Aborted....
|
||||
echo $(tput sgr0)
|
||||
exit
|
||||
fi
|
||||
|
|
Loading…
Reference in New Issue