JohnDigital
Guru
- Joined
- Jan 7, 2015
- Messages
- 1,155
The ports tree is great but sometimes can take awhile to update to the latest version. I use the web version of plex alot and the update nagging forced me to figure this out. I discovered there is no other good tutorial to accomplish this. So here you have it.
First you want to be ssh'd into your FreeNAS Host. Use putty or your favorite terminal to do this. Then we enter the plex jail..
You need to have wget and nano installed so..
Then for ease switch to your PMS directory, for me this is /usr/local/plexdata-plexpass but for you it may be /usr/local/plexdata or something..
Then we need to get the latest version of Plex from the plex.tv website, https://www.plex.tv/media-server-downloads/ at the time of this writing its 1.13.9.5439. Select FreeBSD, right click the download button and select "copy link address".
Then at the Plex jail's terminal do..
Then we get the script. Big thanks to mstinaff over at github.
As it stands its written to only update the plugin version (PBI) so we update it for our use. This is where you need to know if you have standard (plexmediaserver) or (plexmediaserver_plexpass) installed. You probably already know which version you have. Do...
Paste in this script. Its set for the plexpass version. If you dont have plexpass, search and replace instances of plexmediaserver-plexpass and plexmediaserver_plexpass with just plexmediaserver.
Then do CTRL+X, enter, enter to Save file and exit NANO.
Then we make our script executable by
Now its time for the magic, run the command, take care to make the proper edits. Include your plex.tv login credentials if you have plexpass.
AS TIME GOES ON THIS COMMAND WILL CHANGE WITH PLEX VERSIONS. Substitute whatever .tar.bz file was download above. Look by doing a
You should now have the latest version not yet in the ports tree.
Cheers hope this helps you!
First you want to be ssh'd into your FreeNAS Host. Use putty or your favorite terminal to do this. Then we enter the plex jail..
Code:
##Find your plex jail number## jls ##Enter Plex Jail## jexec # csh
You need to have wget and nano installed so..
pkg install nano wget
Then for ease switch to your PMS directory, for me this is /usr/local/plexdata-plexpass but for you it may be /usr/local/plexdata or something..
cd /usr/local/plexdata-plexpass
wget <paste the above copied link here>
Then we get the script. Big thanks to mstinaff over at github.
As it stands its written to only update the plugin version (PBI) so we update it for our use. This is where you need to know if you have standard (plexmediaserver) or (plexmediaserver_plexpass) installed. You probably already know which version you have. Do...
nano PMS_Updater.sh
Paste in this script. Its set for the plexpass version. If you dont have plexpass, search and replace instances of plexmediaserver-plexpass and plexmediaserver_plexpass with just plexmediaserver.
Code:
#!/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 | LogMsg 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
Then do CTRL+X, enter, enter to Save file and exit NANO.
Then we make our script executable by
chmod +x PMS_Updater.sh
Now its time for the magic, run the command, take care to make the proper edits. Include your plex.tv login credentials if you have plexpass.
./PMS_Updater.sh -u USERNAME -p PASSWORD -vv -a
ls
and use that filename to complete the above command.You should now have the latest version not yet in the ports tree.
Cheers hope this helps you!
Last edited: