Skip to main content

Hi all!



inspired by the great @rtrouton , I adjusted his superb script on installing Java.



I added a check to see if java has been installed or if a newer version is available, a bit like my Flash Update script, for which I borrowed heavily on other guys work.



Hope you guys can use this, and if you have any suggestions, please let me know!



#!/bin/bash -e

# This script downloads and installs the latest Oracle Java 8 for compatible Macs

# Determine OS version
osvers=$(sw_vers -productVersion | awk -F. '{print $2}')

# Specify the "OracleUpdateXML" variable by adding the "SUFeedURL" value included in the
# /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist file.
#
# Note: The "OracleUpdateXML" variable is currently specified in the script as that for
# Java 8 Update 20, but the XML address embedded with Java 8 Update 20 is not special in
# this regard. I have verified that using the address for Java 8 Update 5 will also work
# to pull the address of the latest Oracle Java 8 installer disk image. To get the "SUFeedURL"
# value embedded with your currently installed version of Java 8 on Mac OS X, please run
# the following command in Terminal:
#
# defaults read "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info" SUFeedURL
#
# As of Java 8 Update 20, that produces the following return:
#
# https://javadl-esd-secure.oracle.com/update/mac/au-1.8.0_20.xml
#

OracleUpdateXML="https://javadl-esd-secure.oracle.com/update/mac/au-1.8.0_20.xml"

# check if newer version exists
plugin="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist"
if [ -f "$plugin" ]
then
currentver=`/usr/bin/defaults read "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist" CFBundleShortVersionString`
echo " Current version is $currentver"
currentvermain=${currentver:5:1}
echo "Installed main version is $currentvermain"
currentvermin=${currentver:14:2}
echo "Installed minor version is $currentvermin"
/usr/bin/curl --retry 3 -Lo /tmp/au-1.8.0_20.xml $OracleUpdateXML
onlineversion1=`cat /tmp/au-1.8.0_20.xml | awk -F " /enclosure/'{print $(NF-1)}'`
onlineversion2=${onlineversion1:50:8}
onlineversionmain=${onlineversion2:2:1}
echo "Online main: $onlineversionmain"
onlineversionmin=${onlineversion2:6:2}
echo "Online minor: $onlineversionmin"
if [ "$onlineversionmain" -gt "$currentvermain" ]
then
echo "Let's install Java! Main online version is higher than installed version."
installjava=1
fi
if [ "$onlineversionmain" = "$currentvermain" ] && [ "$onlineversionmin" -gt "$currentvermin" ]
then
echo "Let's install Java! Main online version is equal than installed version, but minor version is higher."
installjava=1
fi
if [ "$onlineversionmain" = "$currentvermain" ] && [ "$onlineversionmin" = "$currentvermin" ]
then
echo "Java is up-to-date!"
fi
else
echo "No java installed, let's install"
installjava=1
fi


# Use the XML address defined in the OracleUpdateXML variable to query Oracle via curl
# for the complete address of the latest Oracle Java 8 installer disk image.


fileURL=`/usr/bin/curl --silent $OracleUpdateXML | awk -F " /enclosure/'{print $(NF-1)}'`

# Specify name of downloaded disk image

java_eight_dmg="/tmp/java_eight.dmg"

if [[ ${osvers} -lt 7 ]]; then
echo "Oracle Java 8 is not available for Mac OS X 10.6.8 or earlier."
exit 0
fi
if [ "$installjava" = 1 ]
then
echo "Start installing Java"
if [[ ${osvers} -ge 7 ]]; then

# Download the latest Oracle Java 8 software disk image
# The curl -L option is needed because there is a redirect
# that the requested page has moved to a different location.

/usr/bin/curl --retry 3 -Lo "$java_eight_dmg" "$fileURL"

# Specify a /tmp/java_eight.XXXX mountpoint for the disk image

TMPMOUNT=`/usr/bin/mktemp -d /tmp/java_eight.XXXX`

# Mount the latest Oracle Java 8 disk image to /tmp/java_eight.XXXX mountpoint

hdiutil attach "$java_eight_dmg" -mountpoint "$TMPMOUNT" -nobrowse -noverify -noautoopen

# Install Oracle Java 8 from the installer package. This installer may
# be stored inside an install application on the disk image, or there
# may be an installer package available at the root of the mounted disk
# image.

if [[ -e "$(/usr/bin/find $TMPMOUNT -maxdepth 1 ( -iname *.app ))/Contents/Resources/*Java*.pkg" ]]; then
pkg_path="$(/usr/bin/find $TMPMOUNT -maxdepth 1 ( -iname *.app ))/Contents/Resources/*Java*.pkg"
elif [[ -e "$(/usr/bin/find $TMPMOUNT -maxdepth 1 ( -iname *Java*.pkg -o -iname *Java*.mpkg ))" ]]; then
pkg_path="$(/usr/bin/find $TMPMOUNT -maxdepth 1 ( -iname *Java*.pkg -o -iname *Java*.mpkg ))"
fi

# Before installation, the installer's developer certificate is checked to
# see if it has been signed by Oracle's developer certificate. Once the
# certificate check has been passed, the package is then installed.

if [[ "${pkg_path}" != "" ]]; then
signature_check=`/usr/sbin/pkgutil --check-signature "$pkg_path" | awk /'Developer ID Installer/{ print $5 }'`
if [[ ${signature_check} = "Oracle" ]]; then
# Install Oracle Java 8 from the installer package stored inside the disk image
/usr/sbin/installer -dumplog -verbose -pkg "${pkg_path}" -target "/" > /dev/null 2>&1
fi
fi

# Clean-up

# Unmount the Oracle Java 8 disk image from /tmp/java_eight.XXXX

/usr/bin/hdiutil detach -force "$TMPMOUNT"

# Remove the /tmp/java_eight.XXXX mountpoint

/bin/rm -rf "$TMPMOUNT"

# Remove the downloaded disk image

/bin/rm -rf "$java_eight_dmg"

# Remove xml file
/bin/rm -rf /tmp/au-1.8.0_20.xml
fi
fi

Great script!



I've made the following modifications to my copy of the script.



The main reason was to only download the manual.jsp file once, but also make it work on clients that hasn't been updated in a long time (and therefore only have two letters for the currentvermin string).



#!/bin/sh

# https://www.jamf.com/jamf-nation/discussions/17222/autoupdate-java-by-shell

# Determine OS version
osvers=$(sw_vers -productVersion | awk -F. '{print $2}')

# Download the jsp file for extrating version and url for the dmg
oracle_jsp=/tmp/oracle_manual.jsp
curl -L http://www.java.com/en/download/manual.jsp > $oracle_jsp

# check if newer version exists
plugin="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist"
if [ -f "$plugin" ]
then
currentver=`/usr/bin/defaults read "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info.plist" CFBundleShortVersionString`
echo " Current version is $currentver"
currentvermain=`echo "$currentver" | awk '{print$2}'`
echo "Installed main version is $currentvermain"
currentvermin=`echo "$currentver" | awk '{print$4}'`
echo "Installed minor version is $currentvermin"
onlineversionmain=`cat < $oracle_jsp | grep "Recommended Version" | awk '{ print $4}'`
echo "Online main: $onlineversionmain"
onlineversionmin=`cat < $oracle_jsp | grep "Recommended Version" | awk '{ print $6}' | awk -F "<" '{ print $1}'`
echo "Online minor: $onlineversionmin"
if [ -z "${currentvermain}" ] || [ "${onlineversionmain}" -gt "${currentvermain}" ]
then
echo "Let's install Java! Main online version is higher than installed version."
installjava=1
fi
if [ "${onlineversionmain}" = "${currentvermain}" ] && [ "${onlineversionmin}" -gt "${currentvermin}" ]
then
echo "Let's install Java! Main online version is equal than installed version, but minor version is higher."
installjava=1
fi
if [ "${onlineversionmain}" = "${currentvermain}" ] && [ "${onlineversionmin}" = "${currentvermin}" ]
then
echo "Java is up-to-date!"
fi
else
echo "No java installed, let's install"
installjava=1
fi


# Find Download URL
fileURL=`cat < $oracle_jsp | grep "Download Java for Mac OS X" | head -1 | awk -F """ '{ print $4}'`


# Specify name of downloaded disk image

java_eight_dmg="/tmp/java_eight.dmg"

if [[ ${osvers} -lt 7 ]]; then
echo "Oracle Java 8 is not available for Mac OS X 10.6.8 or earlier."
exit 0
fi

if [ "$installjava" = 1 ]
then
echo "Start installing Java"
if [[ ${osvers} -ge 7 ]]; then

# Download the latest Oracle Java 8 software disk image

/usr/bin/curl --retry 3 -Lo "$java_eight_dmg" "$fileURL"

# Specify a /tmp/java_eight.XXXX mountpoint for the disk image

TMPMOUNT=`/usr/bin/mktemp -d /Volumes/java_eight.XXXX`

# Mount the latest Oracle Java disk image to /tmp/java_eight.XXXX mountpoint

hdiutil attach "$java_eight_dmg" -mountpoint "$TMPMOUNT" -nobrowse -noverify -noautoopen

# Install Oracle Java 8 from the installer package.

if [[ -e "$(/usr/bin/find $TMPMOUNT -name *Java*.pkg)" ]]; then
pkg_path=`/usr/bin/find $TMPMOUNT -name *Java*.pkg`
elif [[ -e "$(/usr/bin/find $TMPMOUNT -name *Java*.mpkg)" ]]; then
pkg_path=`/usr/bin/find $TMPMOUNT -name *Java*.mpkg`
fi

# Before installation, the installer's developer certificate is checked

if [[ "${pkg_path}" != "" ]]; then
echo "installing Java from ${pkg_path}..."
/usr/sbin/installer -dumplog -verbose -pkg "${pkg_path}" -target "/" > /dev/null 2>&1

fi

# Clean-up

# Unmount the disk image from /tmp/java_eight.XXXX

/usr/bin/hdiutil detach -force "$TMPMOUNT"

# Remove the /tmp/java_eight.XXXX mountpoint

/bin/rm -rf "$TMPMOUNT"

# Remove the downloaded disk image

/bin/rm -rf "$java_eight_dmg"

# Remove xml file
/bin/rm -rf /tmp/au-1.8.0_20.xml
fi
fi
# Remove the jsp file
rm $oracle_jsp


edit: added the " | head -1 " suggested by @jpiperbe, since this seems to still be the latest version of the script


@pmex I had to add a



| head -1



between the grep and awk on line 49, for some reason the jsp had "Download for Mac OS X" twice so there were two URLS. (May have been a recent change) but other than that, worked great.


is this for Java or the JDK?


@jpiperbe I fond that out as well. Unfourtunately I didn't see your post until I went here today to correct myself ;-)


I am running the latest version of the script (2/22/17 at 8:53 AM by @pmex ) with @jpiperbe 's | head -1 fix.



The script runs, and I am pretty sure it's installing, as the next time I run, it shows java installed as 8 U 131, which matches the latest version, so it quits. However, when I go into Terminal, and type java --version, it says I have no JRE.



So, looking at the script, it seems like this is updating the Internet Plug-in. Indeed, Safari sees and recognizes it.



So, how can I modify this script to install the actual JRE? We use PowerSchool, and the gradebook requires a JRE.



Thanks for this great script!


@JayDuff Its been a while since you asked the question, but here it goes anyways. The results you are getting from your script seem to be accurate. Running java --version in terminal look for the JSE and will try to install if its not found. This script is dealing with Java JRE, not JSE.



You can check the current version via System Preferences or Safari > Preferences > Websites > Plugins.


Thank you for this script. I've been using for several months now and it has been a huge help with updating/installing the Java JRE in our environment.



I am running into a (hopefully) simple issue, however. The script is running flawlessly, as written, except it doesn't currently update to the current Patch Management version. Currently, the JRE version in Patch Management in the JSS is 8u162, but the manual download page is currently recommending 8u161. Running the script does upgrade all of our users to 8u161, but we still show are 0% patched since Patch Management is looking for 8u162.



We rely on the Patch Management reports to generate our monthly reports. These reports are presented to upper management, so I'd like to find a way to not need to document exceptions each month.



Are there others who are experiencing this? How have you solved the issue?


@dmuncey I have seen the same issue and it is still happening now, a month after your post. I am not sure why this is happening the newest version released by Oracle is 161.


Hello @dmuncey and @techjason ,



We recently released two Software Titles specifically for the CPU release of Java 8. CPU meaning critical patch update and that it follows Oracle's recommended security update path.



The Software titles are named:
Java SE Runtime Environment JRE8 CPU
Java SE Development Kit 8 CPU



The other Software Titles contain both the CPU and PSU updates and that's why it shows the PSU version of .162 as the latest. The above mentioned will show .161 as the latest.



For more information about the difference between PSU and CPU versions please reference: http://www.oracle.com/technetwork/java/javase/cpu-psu-explained-2331472.html



Hope this helps!



Jonny


Reply