diff --git a/README.md b/README.md index 02afca6..7a3b09c 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Using git is way easier and recommended, if you ask me. ``` git clone https://github.com/mrworf/plexupdate.git ``` -Note that git is required (`sudo apt-get install git-all`) +Note that git is required (`sudo apt-get install git`) The main benefit with git clone is that you can update to latest version very easily. If you want to use the auto update feature, you must be using a git clone. diff --git a/plexupdate.sh b/plexupdate.sh index 7219a1a..cb1db45 100755 --- a/plexupdate.sh +++ b/plexupdate.sh @@ -67,6 +67,13 @@ REDHAT_INSTALL="yum -y install" DEBIAN_INSTALL="dpkg -i" DISTRO_INSTALL="" +FILE_STDOUTLOG=$(mktemp /tmp/plexupdate.log.XXXX) +FILE_POSTDATA=$(mktemp /tmp/plexupdate.postdata.XXXX) +FILE_RAW=$(mktemp /tmp/plexupdate.raw.XXXX) +FILE_FAILCAUSE=$(mktemp /tmp/plexupdate.failcause.XXXX) +FILE_KAKA=$(mktemp /tmp/plexupdate.kaka.XXXX) +FILE_SHA=$(mktemp /tmp/plexupdate.sha.XXXX) + # Current pages we need - Do not change unless Plex.tv changes again URL_LOGIN=https://plex.tv/users/sign_in.json URL_DOWNLOAD=https://plex.tv/api/downloads/1.json?channel=plexpass @@ -323,8 +330,7 @@ fi if [ "${CRON}" = "yes" -a "${QUIET}" = "no" ]; then # If running in cron mode, redirect STDOUT to temporary file - STDOUTLOG="$(mktemp)" - exec 3>&1 >"${STDOUTLOG}" + exec 3>&1 >"${FILE_STDOUTLOG}" elif [ "${QUIET}" = "yes" ]; then # Redirect STDOUT to dev null. Use >&3 if you really, really, REALLY need to print to STDOUT exec 3>&1 > /dev/null @@ -368,7 +374,7 @@ if [ "${AUTOUPDATE}" = "yes" ]; then fi # Sanity check -if [ -z "${EMAIL}" -o -z "${PASS}" ] && [ "${PUBLIC}" = "no" ] && [ ! -f /tmp/kaka ]; then +if [ -z "${EMAIL}" -o -z "${PASS}" ] && [ "${PUBLIC}" = "no" ] && [ ! -f "${FILE_KAKA}" ]; then echo "ERROR: Need username & password to download PlexPass version. Otherwise run with -p to download public version." >&2 cronexit 1 fi @@ -440,15 +446,15 @@ keypair() { # Setup an cronexit handler so we cleanup function cleanup { - if [ "${CRON}" = yes -a "${RAWEXIT}" -ne 5 -a -f "${STDOUTLOG}" ]; then + if [ "${CRON}" = yes -a "${RAWEXIT}" -ne 5 -a -f "${FILE_STDOUTLOG}" ]; then exec 1>&3 - cat "${STDOUTLOG}" + cat "${FILE_STDOUTLOG}" fi - rm "${STDOUTLOG}" 2>/dev/null >/dev/null - rm /tmp/postdata 2>/dev/null >/dev/null - rm /tmp/raw 2>/dev/null >/dev/null - rm /tmp/failcause 2>/dev/null >/dev/null - rm /tmp/kaka 2>/dev/null >/dev/null + rm "${FILE_POSTDATA}" 2>/dev/null >/dev/null + rm "${FILE_RAW}" 2>/dev/null >/dev/null + rm "${FILE_FAILCAUSE}" 2>/dev/null >/dev/null + rm "${FILE_KAKA}" 2>/dev/null >/dev/null + rm "${FILE_SHA}" 2>/dev/null >/dev/null } trap cleanup EXIT @@ -462,56 +468,51 @@ trap cleanup EXIT # user[remember_me] 0 # commit Sign in -# Load previous token if stored -if [ -f /tmp/kaka_token ]; then - TOKEN=$(cat /tmp/kaka_token) -fi - if [ "${PUBLIC}" = "no" ]; then echo -n "Authenticating..." # Clean old session - rm /tmp/kaka 2>/dev/null + rm "${FILE_KAKA}" 2>/dev/null # Build post data - echo -ne >/tmp/postdata "$(keypair "user[login]" "${EMAIL}" )" - echo -ne >>/tmp/postdata "&$(keypair "user[password]" "${PASS}" )" - echo -ne >>/tmp/postdata "&$(keypair "user[remember_me]" "0" )" + echo -ne >"${FILE_POSTDATA}" "$(keypair "user[login]" "${EMAIL}" )" + echo -ne >>"${FILE_POSTDATA}" "&$(keypair "user[password]" "${PASS}" )" + echo -ne >>"${FILE_POSTDATA}" "&$(keypair "user[remember_me]" "0" )" # Authenticate (using Plex Single Sign On) - wget --header "X-Plex-Client-Identifier: 4a745ae7-1839-e44e-1e42-aebfa578c865" --header "X-Plex-Product: Plex SSO" --load-cookies /tmp/kaka --save-cookies /tmp/kaka --keep-session-cookies "${URL_LOGIN}" --post-file=/tmp/postdata -q -S -O /tmp/failcause 2>/tmp/raw + wget --header "X-Plex-Client-Identifier: 4a745ae7-1839-e44e-1e42-aebfa578c865" --header "X-Plex-Product: Plex SSO" --load-cookies "${FILE_KAKA}" --save-cookies "${FILE_KAKA}" --keep-session-cookies "${URL_LOGIN}" --post-file="${FILE_POSTDATA}" -q -S -O "${FILE_FAILCAUSE}" 2>"${FILE_RAW}" # Delete authentication data ... Bad idea to let that stick around - rm /tmp/postdata + rm "${FILE_POSTDATA}" # Provide some details to the end user - RESULTCODE=$(head -n1 /tmp/raw | grep -oe '[1-5][0-9][0-9]') + RESULTCODE=$(head -n1 "${FILE_RAW}" | grep -oe '[1-5][0-9][0-9]') if [ $RESULTCODE -eq 401 ]; then echo "ERROR: Username and/or password incorrect" >&2 cronexit 1 elif [ $RESULTCODE -ne 201 ]; then echo "ERROR: Failed to login, debug information:" >&2 - cat /tmp/failcause >&2 + cat "${FILE_FAILCAUSE}" >&2 cronexit 1 fi # If the system got here, it means the login was successfull, so we set the TOKEN variable to the authToken from the response # I use cut -c 14- to cut off the "authToken":" string from the grepped result, can probably be done in a different way - TOKEN=$(/dev/null >/dev/null /tmp/kaka - touch /tmp/kaka + rm 2>/dev/null >/dev/null "${FILE_KAKA}" + touch "${FILE_KAKA}" URL_DOWNLOAD=${URL_DOWNLOAD_PUBLIC} fi if [ "${LISTOPTS}" = "yes" ]; then - opts="$(wget --load-cookies /tmp/kaka --save-cookies /tmp/kaka --keep-session-cookies "${URL_DOWNLOAD}" -O - 2>/dev/null | grep -oe '"label"[^}]*' | grep -v Download | sed 's/"label":"\([^"]*\)","build":"\([^"]*\)","distro":"\([^"]*\)".*/"\3" "\2" "\1"/' | uniq | sort)" + opts="$(wget --load-cookies "${FILE_KAKA}" --save-cookies "${FILE_KAKA}" --keep-session-cookies "${URL_DOWNLOAD}" -O - 2>/dev/null | grep -oe '"label"[^}]*' | grep -v Download | sed 's/"label":"\([^"]*\)","build":"\([^"]*\)","distro":"\([^"]*\)".*/"\3" "\2" "\1"/' | uniq | sort)" eval opts=( "DISTRO" "BUILD" "DESCRIPTION" "======" "=====" "==============================================" $opts ) BUILD= @@ -539,7 +540,7 @@ fi echo -n "Finding download URL to download..." # Set "X-Plex-Token" to the auth token, if no token is specified or it is invalid, the list will return public downloads by default -RELEASE=$(wget --header "X-Plex-Token:"${TOKEN}"" --load-cookies /tmp/kaka --save-cookies /tmp/kaka --keep-session-cookies "${URL_DOWNLOAD}" -O - 2>/dev/null | grep -ioe '"label"[^}]*' | grep -i "\"distro\":\"${DISTRO}\"" | grep -m1 -i "\"build\":\"${BUILD}\"") +RELEASE=$(wget --header "X-Plex-Token:"${TOKEN}"" --load-cookies "${FILE_KAKA}" --save-cookies "${FILE_KAKA}" --keep-session-cookies "${URL_DOWNLOAD}" -O - 2>/dev/null | grep -ioe '"label"[^}]*' | grep -i "\"distro\":\"${DISTRO}\"" | grep -m1 -i "\"build\":\"${BUILD}\"") DOWNLOAD=$(echo ${RELEASE} | grep -m1 -ioe 'https://[^\"]*') CHECKSUM=$(echo ${RELEASE} | grep -ioe '\"checksum\"\:\"[^\"]*' | sed 's/\"checksum\"\:\"//') echo "OK" @@ -555,7 +556,7 @@ if [ $? -ne 0 ]; then cronexit 3 fi -echo "${CHECKSUM} ${DOWNLOADDIR}/${FILENAME}" >"${DOWNLOADDIR}/${FILENAME}.sha" +echo "${CHECKSUM} ${DOWNLOADDIR}/${FILENAME}" >"${FILE_SHA}" if [ "${PRINT_URL}" = "yes" ]; then if [ "${QUIET}" = "yes" ]; then @@ -586,7 +587,7 @@ fi if [ -f "${DOWNLOADDIR}/${FILENAME}" ]; then if [ "${FORCE}" != "yes" -a "${FORCEALL}" != "yes" ]; then - sha1sum --status -c "${DOWNLOADDIR}/${FILENAME}.sha" + sha1sum --status -c "${FILE_SHA}" if [ $? -eq 0 ]; then echo "File already exists (${FILENAME}), won't download." if [ "${AUTOINSTALL}" != "yes" ]; then @@ -600,7 +601,7 @@ if [ -f "${DOWNLOADDIR}/${FILENAME}" ]; then elif [ "${FORCEALL}" == "yes" ]; then echo "Note! File exists, but asked to overwrite with new copy" else - sha1sum --status -c "${DOWNLOADDIR}/${FILENAME}.sha" + sha1sum --status -c "${FILE_SHA}" if [ $? -ne 0 ]; then echo "Note! File exists but fails checksum. Redownloading." else @@ -615,7 +616,7 @@ fi if [ "${SKIP_DOWNLOAD}" = "no" ]; then echo -ne "Downloading release \"${FILENAME}\"..." - ERROR=$(wget --load-cookies /tmp/kaka --save-cookies /tmp/kaka --keep-session-cookies "${DOWNLOAD}" -O "${DOWNLOADDIR}/${FILENAME}" 2>&1) + ERROR=$(wget --load-cookies "${FILE_KAKA}" --save-cookies "${FILE_KAKA}" --keep-session-cookies "${DOWNLOAD}" -O "${DOWNLOADDIR}/${FILENAME}" 2>&1) CODE=$? if [ ${CODE} -ne 0 ]; then echo -e "\n !! Download failed with code ${CODE}, \"${ERROR}\"" @@ -624,7 +625,7 @@ if [ "${SKIP_DOWNLOAD}" = "no" ]; then echo "OK" fi -sha1sum --status -c "${DOWNLOADDIR}/${FILENAME}.sha" +sha1sum --status -c "${FILE_SHA}" if [ $? -ne 0 ]; then echo "Downloaded file corrupt. Try again." cronexit 4 @@ -650,8 +651,6 @@ fi if [ "${AUTODELETE}" = "yes" ]; then if [ "${AUTOINSTALL}" = "yes" ]; then rm -rf "${DOWNLOADDIR}/${FILENAME}" - # Also delete the SHA1 file - rm -rf "${DOWNLOADDIR}/${FILENAME}.sha" echo "Deleted \"${FILENAME}\"" else echo "Will not auto delete without [-a] auto install"