forked from luluhoc/PMS_Updater
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
253 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,253 @@ | ||
#!/bin/sh | ||
|
||
URLBASIC="https://plex.tv/api/downloads/1.json" | ||
URLPLEXPASS="https://plex.tv/api/downloads/1.json?channel=plexpass" | ||
DOWNLOADPATH="/tmp" | ||
LOGPATH="/tmp" | ||
LOGFILE="PMS_Updater.log" | ||
PMSPARENTPATH="/usr/local/share" | ||
PMSLIVEFOLDER="plexmediaserver-plexpass" | ||
PMSBAKFOLDER="plexmediaserver-plexpass.bak" | ||
CERTFILE="/usr/local/share/certs/ca-root-nss.crt" | ||
AUTOUPDATE=0 | ||
FORCEUPDATE=0 | ||
VERBOSE=0 | ||
REMOVE=0 | ||
LOGGING=1 | ||
PLEXPASS=1 | ||
|
||
# Initialize CURRENTVER to the script max so if reading the current version fails | ||
# for some reason we don't blindly clobber things | ||
CURRENTVER=9999.9999.9999.9999.9999 | ||
|
||
|
||
usage() | ||
{ | ||
cat << EOF | ||
usage: $0 options | ||
This script will search the plex.tv download site for a download link | ||
and if it is newer than the currently installed version the script will | ||
download and optionaly install the new version. | ||
OPTIONS: | ||
-u PlexPass username | ||
If -u is specified without -p then the script will | ||
prompt the user to enter the password when needed | ||
-p PlexPass password | ||
-c PlexPass user/password file | ||
When wget is run with username and password on the | ||
command line, that information is displayed in the | ||
process list for all to see. A more secure method | ||
is to create a file readable only by root that is | ||
formatted like this: | ||
user={Your Username Here} | ||
password={Your Password Here} | ||
-l Local file to install instead of latest from Plex.tv | ||
-d download folder (default /tmp) Ignored if -l is used | ||
-a Auto Update to newer version | ||
-f Force Update even if version is not newer | ||
-r Remove update packages older than current version | ||
Done before any update actions are taken. | ||
-v Verbose | ||
-n Use normal version (not PlexPass) version | ||
EOF | ||
} | ||
|
||
## LogMsg() | ||
## READS: STDIN (Piped input) $1 (passed in string) $LOGPATH $LOGFILE | ||
## MODIFIES: NONE | ||
## | ||
## Writes log entries to $LOGGINGPATH/$LOGGINGFILE | ||
LogMsg() | ||
{ | ||
if [ "$1" = "-n" ]; then SWITCH="-n"; fi | ||
while read IN; do | ||
tdStamp=`date +"%Y-%m-%d %H:%M.%S"` | ||
if [ $LOGGING = 1 ]; then echo "$tdStamp $IN" >> $LOGPATH/$LOGFILE; fi | ||
if [ $VERBOSE = 1 ] || [ "$1" = "-f" ]; then echo $SWITCH $IN; fi | ||
done | ||
} | ||
|
||
|
||
|
||
|
||
## verNum() | ||
## READS: $1 (passed in string) | ||
## MODIFIES: NONE | ||
## | ||
## Converts the Plex version string to a mathmatically comparable | ||
## number by removing non numericals and padding each section with zeros | ||
## so v0.9.9.10.485 becomes 00000009000900100485 | ||
verNum() | ||
{ | ||
echo "$@" | awk -F '[^0-9]+' '{ printf("%04d%04d%04d%04d%04d", $1,$2,$3,$4,$5)}' | ||
} | ||
|
||
|
||
## removeOlder() | ||
## READS: $DOWNLOADPATH $PMSPATTERN $CURRENTVER $VERBOSE $LOGGING | ||
## MODIFIES: NONE | ||
## | ||
## Searches $DOWNLOADPATH for PMS install packages and removes versions older | ||
## than $CURRENTVER | ||
removeOlder() | ||
{ | ||
for FOUNDINSTALLFILE in `ls $DOWNLOADPATH/$PMSPATTERN` | ||
do { | ||
if [ $(verNum `basename $FOUNDINSTALLFILE`) -lt $(verNum $CURRENTVER) ]; then { | ||
echo Removing $FOUNDINSTALLFILE | LogMsg | ||
rm -f $FOUNDINSTALLFILE 2>&1 | LogMsg | ||
} fi | ||
} done | ||
} | ||
|
||
|
||
## webGet() | ||
## READS: $1 (URL) $DOWNLOADPATH $USERPASSFILE $USERNAME $PASSWORD $VERBOSE $LOGGING | ||
## MODIFIES: NONE | ||
## | ||
## invoke wget with configured account info | ||
webGet() | ||
{ | ||
local LOGININFO="" | ||
local QUIET="--quiet" | ||
|
||
if [ $PLEXPASS = 1 ]; then | ||
if [ ! "x$USERPASSFILE" = "x" ] && [ -e $USERPASSFILE ]; then | ||
LOGININFO="--config=$USERPASSFILE" | ||
elif [ ! "x$USERNAME" = "x" ]; then | ||
if [ "x$PASSWORD" = "x" ]; then | ||
LOGININFO="--http-user=$USERNAME --ask-password" | ||
else | ||
LOGININFO="--http-user=$USERNAME --http-password=$PASSWORD" | ||
fi | ||
fi | ||
fi | ||
|
||
if [ $VERBOSE = 1 ]; then QUIET=""; fi | ||
echo Downloading $1 | LogMsg | ||
wget $QUIET $LOGININFO --auth-no-challenge --ca-certificate=$CERTFILE --timestamping --directory-prefix="$DOWNLOADPATH" "$1" | ||
if [ $? -ne 0 ]; then | ||
echo Error downloading $1 | ||
exit 1 | ||
else | ||
echo Download Complete | LogMsg | ||
fi | ||
} | ||
|
||
|
||
## findLatest() | ||
## READS: $URLBASIC $URLPLEXPASS $DOWNLOADPATH $PMSPATTERN $VERBOSE $lOGGING | ||
## MODIFIES: $DOWNLOADURL | ||
## | ||
## connects to the Plex.tv download site and scrapes for the latest download link | ||
findLatest() | ||
{ | ||
if [ $PLEXPASS = 1 ]; then local URL=$URLPLEXPASS; else local URL=$URLBASIC; fi | ||
if [ $VERBOSE = 1 ]; then echo Using URL $URL; fi | ||
local SCRAPEFILE=`basename $URL` | ||
|
||
webGet "$URL" || exit $? | ||
echo Searching $URL for the FreeBSD download URL ..... | LogMsg -n | ||
DOWNLOADURL=`cat $DOWNLOADPATH/$SCRAPEFILE | perl -MJSON::PP -E 'say decode_json(<STDIN>)->{computer}{FreeBSD}{releases}[0]{url}'` | ||
if [ "x$DOWNLOADURL" = "x" ]; then { | ||
# DOWNLOADURL is zero length, i.e. nothing matched PMSPATTERN. Error and exit | ||
echo Could not find a FreeBSD download link on page $URL | LogMsg -f | ||
exit 1 | ||
} else { | ||
echo Done. | LogMsg -f | ||
} fi | ||
} | ||
|
||
|
||
## applyUpdate() | ||
## READS: $PMSPARENTPATH $PMSLIVEFOLDER $PMSBAKFOLDER $LOCALINSTALLFILE $VERBOSE $LOGGING | ||
## MODIFIES: NONE | ||
## | ||
## Removes anything in the specified backup location, stops | ||
## Plex, moves the current to backup, then tries to extract the new zip | ||
## to the live location. If there is an error while unpacking the files | ||
## are deleted and the backup is moved back. Plex is then started. | ||
## It could be possible to check status after starting a new plex and | ||
## rolling back if it does not start, should check that it is running | ||
## properly before hand to avoid constantly trying to update a broken | ||
## install | ||
applyUpdate() | ||
{ | ||
|
||
echo Removing previous PMS Backup ..... | LogMsg -n | ||
rm -rf $PMSPARENTPATH/$PMSBAKFOLDER 2>&1 | LogMsg | ||
echo Done. | LogMsg -f | ||
echo Stopping Plex Media Server .....| LogMsg -n | ||
service plexmediaserver_plexpass stop 2>&1 | ||
echo Done. | LogMsg -f | ||
echo Moving current Plex Media Server to backup location .....| LogMsg -n | ||
mv $PMSPARENTPATH/$PMSLIVEFOLDER/ $PMSPARENTPATH/$PMSBAKFOLDER/ 2>&1 | LogMsg | ||
echo Done. | LogMsg -f | ||
echo Extracting $LOCALINSTALLFILE .....| LogMsg -n | ||
mkdir $PMSPARENTPATH/$PMSLIVEFOLDER/ 2>&1 | LogMsg | ||
tar -xj --strip-components 1 --file $LOCALINSTALLFILE --directory $PMSPARENTPATH/$PMSLIVEFOLDER/ 2>&1 | LogMsg -f | ||
if [ $? -ne 0 ]; then { | ||
echo Error exctracting $LOCALINSTALLFILE. Rolling back to previous version. | LogMsg -f | ||
rm -rf $PMSPARENTPATH/$PMSLIVEFOLDER/ 2>&1 | LogMsg -f | ||
mv $PMSPARENTPATH/$PMSBAKFOLDER/ $PMSPARENTPATH/$PMSLIVEFOLDER/ 2>&1 | LogMsg -f | ||
} else { | ||
echo Done. | LogMsg -f | ||
} fi | ||
ln -s $PMSPARENTPATH/$PMSLIVEFOLDER/Plex\ Media\ Server $PMSPARENTPATH/$PMSLIVEFOLDER/Plex_Media_Server 2>&1 | LogMsg | ||
ln -s $PMSPARENTPATH/$PMSLIVEFOLDER/libpython2.7.so.1 $PMSPARENTPATH/$PMSLIVEFOLDER/libpython2.7.so 2>&1 | LogMsg | ||
echo Starting Plex Media Server .....| LogMsg -n | ||
service plexmediaserver_plexpass start | ||
echo Done. | LogMsg -f | ||
} | ||
|
||
while getopts x."u:p:c:l:d:afvrn" OPTION | ||
do | ||
case $OPTION in | ||
u) USERNAME=$OPTARG ;; | ||
p) PASSWORD=$OPTARG ;; | ||
c) USERPASSFILE=$OPTARG ;; | ||
l) LOCALINSTALLFILE=$OPTARG ;; | ||
d) DOWNLOADPATH=$OPTARG ;; | ||
a) AUTOUPDATE=1 ;; | ||
f) FORCEUPDATE=1 ;; | ||
v) VERBOSE=1 ;; | ||
r) REMOVE=1 ;; | ||
n) PLEXPASS=0 ;; | ||
?) usage; exit 1 ;; | ||
esac | ||
done | ||
|
||
# Get the current version | ||
CURRENTVER=`export LD_LIBRARY_PATH=$PMSPARENTPATH/$PMSLIVEFOLDER; $PMSPARENTPATH/$PMSLIVEFOLDER/Plex\ Media\ Server --version` | ||
if [ $REMOVE = 1 ]; then removeOlder; fi | ||
|
||
if [ "x$LOCALINSTALLFILE" = "x" ]; then { | ||
# No local source provided, check the web | ||
findLatest || exit $? | ||
if [ $FORCEUPDATE = 1 ] || [ $(verNum `basename $DOWNLOADURL`) -gt $(verNum $CURRENTVER) ]; then { | ||
webGet "$DOWNLOADURL" || exit $? | ||
LOCALINSTALLFILE="$DOWNLOADPATH/`basename $DOWNLOADURL`" | ||
} else { | ||
echo Already running latest version $CURRENTVER | LogMsg | ||
exit | ||
} fi | ||
} elif [ ! $FORCEUPDATE = 1 ] && [ $(verNum `basename $LOCALINSTALLFILE`) -le $(verNum $CURRENTVER) ]; then { | ||
echo Already running version $CURRENTVER | LogMsg | ||
echo Use -f to force install $LOCALINSTALLFILE | LogMsg | ||
exit | ||
} fi | ||
|
||
|
||
# If either update flag is set then verify archive integrity and install | ||
if [ $FORCEUPDATE = 1 ] || [ $AUTOUPDATE = 1 ]; then { | ||
echo Verifying $LOCALINSTALLFILE ..... | LogMsg -n | ||
bzip2 -t $LOCALINSTALLFILE | ||
if [ $? -ne 0 ]; then { | ||
echo $LOCALINSTALLFILE is not a valid archive, cannot update with this file. | LogMsg -f | ||
} else { | ||
echo Done | LogMsg -f | ||
applyUpdate | ||
} fi | ||
} fi |