2018-07-20 03:21:48 +02:00
#!/bin/bash
### Linux .jar Update Script for ProfitTrailer
2019-04-24 05:23:57 +02:00
### LAST UPDATED 24 Apr 2019
2018-07-20 03:21:48 +02:00
### 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.
### Example
### /var
### /opt
### /btc bot
### /eth bot
2019-02-10 02:40:26 +01:00
### linux-update.sh
2018-07-20 03:21:48 +02:00
### cd to the directory you have it in e.g cd /var/opt
2019-02-10 02:40:26 +01:00
### execute using ./linux-update.sh to downlaod the latest github release
2018-07-20 03:21:48 +02:00
2019-04-24 06:05:33 +02:00
### OPTIONS ### ./update.sh option1 option2
### This script can be executed with some optional parameters
### auto - automaticlaly upgrade without any confirmation to the latest version
### noupdate - do not update the script from github
2019-04-24 06:36:37 +02:00
### betaurl - Enter the url to a profitTrailer Zip file to update to that beta version without confirmation e.g https://domain.com.ProfitTrailer-2.3.2.zip
2019-04-24 06:05:33 +02:00
2019-02-10 02:40:26 +01:00
### INSTALL DEPENDENCIES ###
2018-07-20 03:21:48 +02:00
### Check if unzip is installed ###
if ! [ -x " $( command -v unzip) " ] ; then
2019-04-24 05:23:57 +02:00
echo "Unzip is not installed, Installing now..."
sudo apt install unzip
2018-07-20 03:21:48 +02:00
2019-04-24 05:23:57 +02:00
if ! [ -x " $( command -v unzip) " ] ; then
2018-08-09 00:27:20 +02:00
echo
2019-04-24 05:23:57 +02:00
echo " $( tput setaf 1) Something went wrong.... $( tput sgr0) "
2018-08-09 00:27:20 +02:00
exit
2019-04-24 05:23:57 +02:00
else
echo $( tput setaf 2)
echo "Unzip Installed"
echo $( tput sgr0)
2018-08-09 00:27:20 +02:00
fi
fi
### Check if curl is installed ###
if ! [ -x " $( command -v curl) " ] ; then
2019-04-24 05:23:57 +02:00
echo "Curl is not installed, Installing now..."
sudo apt install curl
2018-08-09 00:27:20 +02:00
2019-04-24 05:23:57 +02:00
if ! [ -x " $( command -v curl) " ] ; then
2018-07-20 03:21:48 +02:00
echo
2019-04-24 05:23:57 +02:00
echo " $( tput setaf 1) Something went wrong.... $( tput sgr0) "
2018-07-20 03:21:48 +02:00
exit
2019-04-24 05:23:57 +02:00
else
echo $( tput setaf 2)
echo "Curl Installed"
echo $( tput sgr0)
2018-07-20 03:21:48 +02:00
fi
fi
2019-04-24 05:33:35 +02:00
### Set all child processes to this locale language to prevent rev from breaking
export LC_ALL = 'en_US.UTF-8'
###Get the Directory and filename of the script###
DIR = $( dirname " $( readlink -f " $0 " ) " )
script = $( basename " $0 " )
2019-04-24 06:05:33 +02:00
if [ [ ! " $@ " = = *"noupdate" * ] ] ; then
### Update linux-update script ###
### -s silent -O output to a file ###
curl -s https://raw.githubusercontent.com/taniman/profit-trailer/master/update.sh -O > /dev/null
### Get line containing LAST UPDATED (line 4 typically) ###
### -i ignore case, -m 1 match only first instance ###
olddate = $( grep -i -m 1 'updated' " $DIR " /" $script " )
newdate = $( grep -i -m 1 'updated' update.sh)
if [ [ ! $olddate = = $newdate ] ] ; then
mv -f update.sh " $DIR " /" $script " 2>/dev/null
chmod +x " $DIR " /" $script "
if [ [ ! $1 ] ] ; then
exec " $DIR " /" $script "
else
exec " $DIR " /" $script " " $@ "
fi
2019-04-24 05:33:35 +02:00
fi
2019-04-24 06:05:33 +02:00
else
2019-04-24 06:36:37 +02:00
echo
2019-04-24 06:05:33 +02:00
echo "Skipped script update"
2019-04-24 06:36:37 +02:00
sleep 2
2019-04-24 05:33:35 +02:00
fi
### Clear screen and print header ###
clear
echo $( tput setaf 3)
echo "##################################################"
echo " ProfitTrailer Update Script "
echo "##################################################"
echo $( tput sgr0)
2019-02-10 02:40:26 +01:00
### LOAD PREVIOUS CONFIG ###
2019-02-09 05:51:27 +01:00
2018-07-20 03:21:48 +02:00
### If no previous config can be found enter setup automatically ###
2019-02-09 05:51:27 +01:00
if [ ! -f " $DIR " /updatescript/name.txt ] ; then
2018-07-20 03:21:48 +02:00
skipsetup = N
echo " $( tput setaf 2) No Previous Setup Found - Entering Setup $( tput sgr0) "
echo
else
echo Loading from saved setup...
echo
### load arrary of app names/ID/pid saved previously ###
2019-02-09 05:51:27 +01:00
mapfile -t name < " $DIR " /updatescript/name.txt
2018-07-20 03:21:48 +02:00
for i in $( seq ${# name [*] } ) ; do
[ [ ${ name [ $i -1] } = $name ] ]
done
### count number of instances in the arrary (exclude header by subtracting 1) ###
PTinstances = " $(( ${# name [@] } - 1 )) "
### load arrary of paths saved previously ###
2019-02-09 05:51:27 +01:00
mapfile -t path < " $DIR " /updatescript/path.txt
2018-07-20 03:21:48 +02:00
for ( ( i = 1; i<= PTinstances; i++) ) ; do
[ [ ${ path [ $i -1] } = $path ] ]
### check that the directories actually exist and an empty string is not provided ###
if [ [ -d " ${ path [ $i ] } " ] ] && [ [ -n " ${ path [ $i ] } " ] ] ; then
continue
else
echo " $( tput setaf 1) Path for instance $i does no exist. Setup required. $( tput sgr0) "
skipsetup = N
fi
done
2019-02-10 02:40:26 +01:00
if [ [ ! $skipsetup = = "N" ] ] ; then
2018-07-20 03:21:48 +02:00
### print out the arrays as a table for user to check ###
2019-04-24 05:23:57 +02:00
### pad the columns by 8 places for legibility %-8s\n ###
2018-07-20 03:21:48 +02:00
echo " $( tput setaf 6) Your current configuration is: $( tput sgr0) "
paste <( printf "%-8s\n" " ${ name [@] } " ) <( printf "%-8s\n" " ${ path [@] } " )
2019-04-24 05:23:57 +02:00
if [ [ $1 = = "auto" ] ] ; then
skipsetup = Y
else
echo
read -p "Do you wish to proceed with this configuration? (Y/N) " skipsetup
fi
2018-07-20 03:21:48 +02:00
fi
fi
2019-02-10 02:40:26 +01:00
### SETUP ###
2018-07-20 03:21:48 +02:00
2019-02-10 02:40:26 +01:00
if [ [ $skipsetup = = "n" ] ] || [ [ $skipsetup = = "N" ] ] ; then
2018-07-20 03:21:48 +02:00
2019-04-24 05:23:57 +02:00
### Set proceed variable to No, causing loop until user confirms proceed later ###
2018-07-20 03:21:48 +02:00
proceed = N
echo $( tput setaf 3)
echo "##################################################"
echo " Setup"
echo "##################################################"
echo $( tput sgr0)
2018-07-23 01:22:57 +02:00
2019-02-10 02:40:26 +01:00
while [ [ $proceed = = "N" ] ] || [ [ $proceed = = "n" ] ] ; do
2018-07-20 03:21:48 +02:00
### wipe arrays clean then set the header for each array ###
name = ( )
path = ( )
name[ 0] = Name/ID
path[ 0] = Path
### show user their current pm2 instances to assist with setup ###
pm2 list
echo
read -p "How many ProfitTrailer Bots do you want to update? " PTinstances
echo
### ask user for the name and path of each instance they wish to update ###
for ( ( i = 1; i<= $PTinstances ; i++) ) ; do
2019-02-09 05:51:27 +01:00
### use the lack of profittrailer.jar to loop through setup.
2018-07-20 03:21:48 +02:00
while [ [ ! -f " ${ path [ $i ] } " /ProfitTrailer.jar ] ] ; do
2019-02-09 05:51:27 +01:00
read -p " What is the PM2 App name/ id for instance $i ? " newname
2019-02-10 02:40:26 +01:00
### 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 "
2019-02-09 05:51:27 +01:00
### 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 ###
if [ [ $newname = ~ " ^[0-9]+ $" ] ]
echo
then
### use grep, sed and cut to find the field the pm2 process name is in. Future PM2 updates might break this and need changing ###
rename = $( pm2 info " $newname " | grep 'name' | sed -n '1p' | cut -d ' ' -f 9-)
### remove any leading or trailing spaces or tabs ###
nowhitespace = $( echo " $rename " | xargs)
name[ $i ] = $nowhitespace
fi
2019-02-10 02:40:26 +01:00
### If no directory exists for the given pm2 process or nothing is entered, ask again ###
2018-07-20 03:21:48 +02:00
if [ [ ! -d " ${ path [ $i ] } " ] ] || [ [ -z " ${ path [ $i ] } " ] ] ; then
echo " $( tput setaf 1) Path for instance $i does not exist. Try again... $( tput sgr0) "
2019-02-09 05:51:27 +01:00
### 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
2019-02-10 02:40:26 +01:00
if [ [ $empty = = "y" ] ] || [ [ $empty = = "Y" ] ] || [ [ $empty = = "yes" ] ] || [ [ $empty = = "Yes" ] ] ; then
2019-02-09 05:51:27 +01:00
break
fi
2018-07-20 03:21:48 +02:00
fi
done
done
### print out the arrays as a table for user to check ###
### %-8s pads the columns to make it appear correctly ###
echo " $( tput setaf 6) The configuration entered is: $( tput sgr0) "
paste <( printf "%-8s\n" " ${ name [@] } " ) <( printf "%-8s\n" " ${ path [@] } " )
echo
read -p "Is this correct? (Y/N) " proceed
echo
### If something else is entered ask for a new answer ###
2019-02-10 02:40:26 +01:00
while [ [ ! $proceed = = "y" ] ] && [ [ ! $proceed = = "Y" ] ] && [ [ ! $proceed = = "n" ] ] && [ [ ! $proceed = = "N" ] ] ; do
2018-07-20 03:21:48 +02:00
echo Please Try Again...
read -p "Is this correct? (Y/N) " proceed
echo
done
2019-02-10 02:40:26 +01:00
if [ [ $proceed = = "Y" ] ] || [ [ $proceed = = "y" ] ] ; then
2018-07-20 03:21:48 +02:00
### 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 ###
2019-02-10 02:40:26 +01:00
while [ [ ! $savetofile = = "y" ] ] && [ [ ! $savetofile = = "Y" ] ] && [ [ ! $savetofile = = "n" ] ] && [ [ ! $savetofile = = "N" ] ] ; do
2018-07-20 03:21:48 +02:00
echo Please Try Again...
read -p "Do you wish to save this setup? (Y/N) " savetofile
echo
done
2019-02-10 02:40:26 +01:00
if [ [ $savetofile = = "Y" ] ] || [ [ $savetofile = = "y" ] ] ; then
2019-02-09 05:51:27 +01:00
### create the folder for the config if necessary ###
mkdir -p " $DIR " /updatescript
2018-07-20 03:21:48 +02:00
### print each array to a file, one element per row ###
2019-02-09 05:51:27 +01:00
printf "%s\n" " ${ name [@] } " > " $DIR " /updatescript/name.txt
printf "%s\n" " ${ path [@] } " > " $DIR " /updatescript/path.txt
2018-07-20 03:21:48 +02:00
echo $( tput setaf 2)
echo Configuration Saved
echo $( tput sgr0)
else
echo $( tput setaf 2)
echo Configuration Not Saved
echo $( tput sgr0)
fi
else
echo $( tput setaf 3)
echo Starting setup again...
echo $( tput sgr0)
fi
done
2019-02-10 02:40:26 +01:00
elif [ [ ! $skipsetup = = "y" ] ] && [ [ ! $skipsetup = = "Y" ] ] ; then
2018-07-20 03:21:48 +02:00
echo $( tput setaf 1)
echo Process Aborted....
echo $( tput sgr0)
exit
fi
2019-02-10 02:40:26 +01:00
### DOWNLOAD AND INSTALL ###
2019-02-09 05:51:27 +01:00
2019-04-23 00:03:47 +02:00
### Get latest Version number
latest = $( curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep tag_name | cut -d '"' -f 4 | sed -n '1p' )
2019-04-24 05:23:57 +02:00
current = $( unzip -p " ${ path [1] } " /ProfitTrailer.jar META-INF/MANIFEST.MF | grep Implementation-Version | cut -d ' ' -f 2)
url = $( curl -s https://api.github.com/repos/taniman/profit-trailer/releases | grep browser_download_url | cut -d '"' -f 4 | sed -n '1p' )
### Break the current version into SemVer segments ###
IFS = '.' read -a version_parts <<< " $current "
major = ${ version_parts [0] }
minor = ${ version_parts [1] }
### Strip Beta Version if required ###
patch = $( echo ${ version_parts [2] } | cut -d '-' -f 1)
2019-04-23 00:03:47 +02:00
2018-07-20 03:21:48 +02:00
2019-02-10 02:40:26 +01:00
echo $( tput setaf 3)
echo "##################################################"
echo " Update"
echo "##################################################"
echo $( tput sgr0)
echo
2019-04-24 05:23:57 +02:00
echo " The current version is $( tput setaf 6) $current $( tput sgr0) "
echo " Latest release is version $( tput setaf 6) $latest $( tput sgr0) "
2018-07-20 03:21:48 +02:00
2019-04-24 05:23:57 +02:00
2019-04-24 06:36:37 +02:00
if [ [ ! " $@ " = = *"auto" * || ! " $@ " = = *"ProfitTrailer" * ] ] ; then
2019-04-24 05:23:57 +02:00
echo
echo "Please select an option below: (1-7)"
### Loop through the selection menu until a valid version and url is found ###
while [ [ $exists = = *"404 Not Found" * ] ] || [ [ -z $exists ] ] ; do
if [ [ $major = = "2" ] ] && [ [ $minor = = "2" ] ] && [ [ ! $patch = = "12" ] ] ; then
echo $( tput setaf 3)
echo "CAUTION!"
echo " You need to update to 2.2.12 and run the bot before updating to $latest "
echo $( tput sgr0)
echo "Select Choose Specific Version (5) from the options below and enter 2.2.12 when prompted"
elif [ [ $major = = "2" ] ] && [ [ $minor = = "1" ] ] && [ [ ! $patch = = "30" ] ] || [ [ $major = = "2" ] ] && [ [ $minor = = "0" ] ] ; then
echo $( tput setaf 3)
echo "CAUTION!"
echo " You need to update to 2.1.30 and run the bot before updating to $latest "
echo $( tput sgr0)
echo "Select Choose Specific Version (5) from the options below and enter 2.1.30 when prompted"
fi
### Use options menu to select the version number of the desired download. Also allow Beta Url to be entered ###
options = ( "Latest Release" "Increment Major Version" "Increment Minor Version" "Increment Patch Version" "Choose Specific Version" "Beta Patch" "Exit" )
select opt in " ${ options [@] } "
do
case " $opt " in
"Latest Release" )
version = $latest
break
; ;
"Increment Major Version" )
newmajor = $(( major + 1 ))
version = " $newmajor .0.0 "
break
; ;
"Increment Minor Version" )
newminor = $(( minor + 1 ))
version = " $major . $newminor .0 "
break
; ;
"Increment Patch Version" )
newpatch = $(( patch + 1 ))
version = " $major . $minor . $newpatch "
break
; ;
"Choose Specific Version" )
### Regex for x.x.x ###
rx = '^([0-9]+\.){2}(\*|[0-9]+)$'
read -p "Please enter the version you wish to update to: " version
while [ [ ! $version = ~ $rx ] ] ; do
echo "Enter the version number in the format (x.x.x)"
read -p "Please enter the version you wish to update to: " version
echo
done
break
; ;
"Beta Patch" )
echo
read -p "Enter the full url to the Beta Zip file: " download
echo
version = $( echo $download | rev | cut -d'/' -f 1 | rev | sed 's/\(.*\).zip/\1/' | sed 's/\(.*\).jar/\1/' | rev | sed 's/\(.*\)-reliarTtiforP/\1/' | rev)
break
; ;
"Exit" )
echo $( tput setaf 1)
echo Process Aborted....
echo $( tput sgr0)
exit
; ;
esac
done
### If the download URL was not set (Beta patch) set it now and adjust it if necessary for the selected version ###
if [ -z " $download " ] ; then
download = ${ url // $latest / $version }
fi
### get the http status of the url to determine if it is a real link or not ###
exists = $( curl -Is $download | head -1)
if [ [ $exists = = *"404 Not Found" * ] ] ; then
download =
echo $( tput setaf 1)
echo " Download URL for $version does not exist or is not reachable. "
echo $( tput sgr0)
echo "Please select an option below: (1-7)"
fi
done
echo
echo " Updating to version $( tput setaf 6) $version $( tput sgr0) "
echo
2019-02-10 02:40:26 +01:00
read -p "Do you want to continue? (Y/N) " continue
echo
2019-04-24 05:23:57 +02:00
### 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
2019-04-24 06:36:37 +02:00
### If auto parameter or beta url was used as an argument, skip the menu and update to the latest release ###
2019-04-24 05:23:57 +02:00
else
continue = Y
version = $latest
2019-04-24 06:36:37 +02:00
for arg in " $@ " ; do
if [ [ $arg = = *"http" * ] ] ; then
download = $arg
version = $( echo $download | rev | cut -d'/' -f 1 | rev | sed 's/\(.*\).zip/\1/' | sed 's/\(.*\).jar/\1/' | rev | sed 's/\(.*\)-reliarTtiforP/\1/' | rev)
fi
2019-04-24 05:23:57 +02:00
echo
secs = $(( 10 ))
while [ $secs -gt 0 ] ; do
echo -ne " Updating to version $( tput setaf 6) $version $( tput sgr0) in $secs \033[0K seconds...\r "
sleep 1
: $(( secs--))
done
fi
2018-07-20 03:21:48 +02:00
2019-02-10 02:40:26 +01:00
if [ [ $continue = = "y" ] ] || [ [ $continue = = "Y" ] ] ; then
### Download & extract latest version of PT ###
echo
echo " $( tput setaf 2) === Downloading ProfitTrailer $version === $( tput sgr0) "
2019-04-24 05:23:57 +02:00
### -q for quiet to minimise output but --progress-bar to give us a progress bar ###
2019-02-10 02:40:26 +01:00
curl $download -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 ###
2019-04-24 05:23:57 +02:00
unzip -q -j -o ProfitTrailer-$version .zip '*jar'
2019-02-10 02:40:26 +01:00
### 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
2019-02-09 05:51:27 +01:00
2019-02-10 02:40:26 +01:00
### 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
2019-02-09 05:51:27 +01:00
fi
2019-02-10 02:40:26 +01:00
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 ] } "
mkdir -p " $DIR " /updatescript/" $( date +%m%d_%H%M) " /" ${ name [ $i ] } "
2019-03-19 23:39:38 +01:00
cp " ${ path [ $i ] } " /data/ptdb.db " $DIR " /updatescript/" $( date +%m%d_%H%M) " /" ${ name [ $i ] } " /ptdb.db
2018-07-20 03:21:48 +02:00
echo
2019-02-10 02:40:26 +01:00
echo " $( tput setaf 2) === Restarting ${ name [ $i ] } === $( tput sgr0) "
pm2 reload " ${ name [ $i ] } "
done
### Remove downloaded Files ###
echo
echo " $( tput setaf 2) === Cleaning up === $( tput sgr0) "
if [ [ $loc = = "Y" ] ] ; then
rm -rf ProfitTrailer-$version *.zip
2018-07-20 03:21:48 +02:00
else
2019-02-10 02:40:26 +01:00
rm -rf ProfitTrailer-$version *.zip ProfitTrailer.jar
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 -d "\n" rm -r
echo "Removed old backups from updatescript folder."
2018-07-20 03:21:48 +02:00
fi
2019-02-09 05:51:27 +01:00
2019-02-10 02:40:26 +01:00
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
2019-02-09 07:49:41 +01:00
fi