Script to Install & Update Zoom

omatsei
New Contributor III

We use Zoom a lot, so I modified a script that we were using for Firefox (Thanks Joe Farage!) to install or update to the newest version of Zoom. This one enables HD video, sets SSO logins to be default, and configures the URL for SSO. Below is the script:

#!/bin/sh
#####################################################################################################
#
# ABOUT THIS PROGRAM
#
# NAME
#       ZoomInstall.sh -- Installs or updates Zoom
#
# SYNOPSIS
#       sudo ZoomInstall.sh
#
####################################################################################################
#
# HISTORY
#
#       Version: 1.0
#
#       - Shannon Johnson, 28.9.2018
#       (Adapted from the FirefoxInstall.sh script by Joe Farage, 18.03.2015)
#
####################################################################################################
# Script to download and install Zoom.
# Only works on Intel systems.
#

# Set preferences - set to anything besides "true" to disable
hdvideo="true"
ssodefault="true"
ssohost="psu.zoom.us"


# choose language (en-US, fr, de)
lang=""
# CHECK TO SEE IF A VALUE WAS PASSED IN PARAMETER 1 AND, IF SO, ASSIGN TO "lang"
if [ "$4" != "" ] && [ "$lang" == "" ]; then
        lang=$4
else 
        lang="en-US"
fi

pkgfile="ZoomInstallerIT.pkg"
plistfile="us.zoom.config.plist"
logfile="/Library/Logs/ZoomInstallScript.log"

# Are we running on Intel?
if [ '`/usr/bin/uname -p`'="i386" -o '`/usr/bin/uname -p`'="x86_64" ]; then
        ## Get OS version and adjust for use with the URL string
        OSvers_URL=$( sw_vers -productVersion | sed 's/[.]/_/g' )

        ## Set the User Agent string for use with curl
        userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X ${OSvers_URL}) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2"

        # Get the latest version of Reader available from Zoom page.
        latestver=`/usr/bin/curl -s -A "$userAgent" https://zoom.us/download | grep 'ZoomInstallerIT.pkg' | awk -F'/' '{print $3}'`
        echo "Latest Version is: $latestver"

        # Get the version number of the currently-installed Zoom, if any.
        if [ -e "/Applications/zoom.us.app" ]; then
                currentinstalledver=`/usr/bin/defaults read /Applications/zoom.us.app/Contents/Info CFBundleShortVersionString`
                echo "Current installed version is: $currentinstalledver"
                if [ ${latestver} = ${currentinstalledver} ]; then
                        echo "Zoom is current. Exiting"
                        exit 0
                fi
        else
                currentinstalledver="none"
                echo "Zoom is not installed"
        fi

        url="https://zoom.us/client/${latestver}/ZoomInstallerIT.pkg"

        echo "Latest version of the URL is: $url"
        echo "`date`: Download URL: $url" >> ${logfile}

        # Compare the two versions, if they are different or Zoom is not present then download and install the new version.
        if [ "${currentinstalledver}" != "${latestver}" ]; then

                # Construct the plist file for preferences
                echo "<?xml version="1.0" encoding="UTF-8"?>
                 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
                 <plist version="1.0">
                 <dict>
                        <key>nogoogle</key>
                        <string>1</string>
                        <key>nofacebook</key>
                        <string>1</string>
                        <key>ZDisableVideo</key>
                        <true/>
                        <key>ZAutoJoinVoip</key>
                        <true/>
                        <key>ZDualMonitorOn</key>
                        <true/>" >> /tmp/${plistfile}

                if [ "${ssohost}" != "" ]; then
                        echo "
                        <key>ZAutoSSOLogin</key>
                        <true/>
                        <key>ZSSOHost</key>
                        <string>$ssohost</string>" >> /tmp/${plistfile}
                fi

                echo "<key>ZAutoFullScreenWhenViewShare</key>
                        <true/>
                        <key>ZAutoFitWhenViewShare</key>
                        <true/>" >> /tmp/${plistfile}

                if [ "${hdvideo}" == "true" ]; then
                        echo "<key>ZUse720PByDefault</key>
                        <true/>" >> /tmp/${plistfile}
                else
                        echo "<key>ZUse720PByDefault</key>
                        <false/>" >> /tmp/${plistfile}
                fi

                echo "<key>ZRemoteControlAllApp</key>
                        <true/>
                </dict>
                </plist>" >> /tmp/${plistfile}

                # Download and install new version
                /bin/echo "`date`: Current Zoom version: ${currentinstalledver}" >> ${logfile}
                /bin/echo "`date`: Available Zoom version: ${latestver}" >> ${logfile}
                /bin/echo "`date`: Downloading newer version." >> ${logfile}
                /usr/bin/curl -L -o /tmp/${pkgfile} ${url}
                /bin/echo "`date`: Installing PKG..." >> ${logfile}
                /usr/sbin/installer -allowUntrusted -pkg /tmp/${pkgfile} -target /

                /bin/sleep 10
                /bin/echo "`date`: Deleting downloaded PKG." >> ${logfile}
                /bin/rm /tmp/${pkgfile}

                #double check to see if the new version got updated
                newlyinstalledver=`/usr/bin/defaults read /Applications/zoom.us.app/Contents/Info CFBundleShortVersionString`
        if [ "${latestver}" = "${newlyinstalledver}" ]; then
                /bin/echo "`date`: SUCCESS: Zoom has been updated to version ${newlyinstalledver}" >> ${logfile}
                # /Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType hud -title "Zoom Installed" -description "Zoom has been updated." &
        else
                /bin/echo "`date`: ERROR: Zoom update unsuccessful, version remains at ${currentinstalledver}." >> ${logfile}
                /bin/echo "--" >> ${logfile}
                        exit 1
                fi

        # If Zoom is up to date already, just log it and exit.
        else
                /bin/echo "`date`: Zoom is already up to date, running ${currentinstalledver}." >> ${logfile}
        /bin/echo "--" >> ${logfile}
        fi      
else
        /bin/echo "`date`: ERROR: This script is for Intel Macs only." >> ${logfile}
fi

exit 0
141 REPLIES 141

lamador
New Contributor III

this was a bug in 5.6.0 @Colezy it was solved in 5.6.1. Have you tried again?

Schwud
New Contributor

I have just fond this and used one of the early versions and just removed the plist parameters and the set preferences and it seems work fine for me still so just wanted to say thank you it has saved me a lot of headache and time 

mgeorgecv
New Contributor III

I created a much less thorough script that just installs the latest ZoomInstallerIT package, as well as a script for an extension to check if Zoom is up to date.

Installer:

#!/bin/bash
mkdir /tmp/downloads
cd /tmp/downloads

#Installing Zoom
        # Download Zoom PKG
        sudo /usr/bin/curl -L -o ./ZoomInstallerIT.pkg https://zoom.us/client/latest/ZoomInstallerIT.pkg

        # Install Zoom
                sudo /usr/sbin/installer -allowUntrusted -pkg ./ZoomInstallerIT.pkg -target /
                /bin/sleep 20
                
rm -rf /tmp/downloads*

Extension:

#!/bin/bash

        # Get OS version and adjust for use with the URL string
        OSvers_URL=$( sw_vers -productVersion | sed 's/[.]/_/g' )

        # Set the User Agent string for use with curl
        userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X ${OSvers_URL}) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2"

        # Get the latest version of Reader available from Zoom page.
        CurrentZoom=`/usr/bin/curl -s -A "$userAgent" https://zoom.us/download | grep 'ZoomInstallerIT.pkg' | awk -F'/' '{print $3}'`

if [ -d /Applications/zoom.us.app ]; then
ZoomVersion=$( /usr/bin/defaults read /Applications/zoom.us.app/Contents/Info CFBundleShortVersionString | tr -d ' ,)' | tr -s '(' '.')
ZoomCheck=$ZoomVersion
else
ZoomCheck="Notinstalled"
fi
if [ "$ZoomCheck" == "$CurrentZoom" ]; then #Is Zoom up to date?
    result="ZoomUpToDate"
else result="ZoomNotUpToDate"
fi
echo "<result>$result</result>"

mgeorgecv
New Contributor III

I then created Smart Groups and Policies to run the script on computers that were not up to date.

I pulled inspiration from several scripts on Jamf Nation, starting with: https://community.jamf.com/t5/jamf-pro/install-update-vlc/m-p/254031#M235945

Loic
New Contributor II

Hi everyone

It seems that the script can't get the latest version hosted by https://zoom.us/download anymore
Any idea, please ?

jimnorrisiv
New Contributor II

Hey Loic,

Lee R in the MacAdmins Slack recently shared this updated one with me that works:

#!/bin/bash
# This script runs within a policy is scoped to devices listed as 'Old' in the Extension Attribute.
OSvers_URL=$( sw_vers -productVersion | sed 's/[.]/_/g' )

userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X ${OSvers_URL}) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2"

# Get the latest version of Reader available from Zoom page.
latestver=`/usr/bin/curl -s -A "$userAgent" https://zoom.us/download | grep 'ZoomInstallerIT.pkg' | awk -F'/' '{print $3}'`
ulatestver=`/usr/bin/curl -s -A "$userAgent" https://support.zoom.us/hc/en-us/articles/201361963-Release-notes-for-macOS | grep 'version 5.' | head -1 | sed 's/^.*5./5./' | tr -d ' ' | sed -r 's/[(]+/./g' | cut -f1 -d")"`

echo "$latestver"
echo "$ulatestver"
echo "Installing version ${latestver}";

url="https://zoom.us/client/${ulatestver}/ZoomInstallerIT.pkg"

/usr/bin/curl -L -o /var/tmp/ZoomInstallerIT.pkg ${url};
res=$?
echo "$res"
if test "$res" != "0"; then
echo "the curl command failed with: $res"
exit 1
else
/usr/sbin/installer -pkg /var/tmp/ZoomInstallerIT.pkg -target /;
exit 0
fi

 

What does your EA look like that runs along with your new script?

I'm not using an extension attribute for this, it's just a comment from the original author. I scope my policy to smart groups that check for computers with a Zoom version < the current version.

I have my script in a policy that runs once a week and installs whichever version is available at the time. Two years in, no issues seen so far.

What machine you running this on? intel or apple silicone?

How recent did you get this?

I ask because i used a similar script for determining the latest version and it no longer works.

I had tried the same thing for zoominstaller and also for the update page separately (also tested your script just now), and they all come up with no info.

 

When i dug into the HTML, it seems to make sense since the versions are actually called via JS - if you curled the page itself you wont be able to find "ZoomInstallerIT", at least on my M1 max machine running 12.5.

 

Can you show screenshots that it works as expected for you?

 

 

W:~ X$ OSvers_URL=$( sw_vers -productVersion | sed 's/[.]/_/g' )
W:~ X$ userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X ${OSvers_URL}) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2"
W:~ X$ latestver=`/usr/bin/curl -s -A "$userAgent" https://zoom.us/download | grep 'ZoomInstallerIT.pkg' | awk -F'/' '{print $3}'`
W:~ X$ echo $latestvers

W:~ X$ ulatestver=`/usr/bin/curl -s -A "$userAgent" https://support.zoom.us/hc/en-us/articles/201361963-Release-notes-for-macOS | grep 'version 5.' | head -1 | sed 's/^.*5./5./' | tr -d ' ' | sed -r 's/[(]+/./g' | cut -f1 -d")"`
W:~ X$ echo $ulatestvers

W:~ X$ echo "$ulatestvers"

W:~ X$ 

jimnorrisiv
New Contributor II

You have a typo: you're calling something to be stored in $latestver and trying to echo $latestvers

good catch, ty!

 

ulatestver works!

Here is to hoping zoom doesnt change stuff again, a la the URL for the release notes or embedding things in JSON

jimnorrisiv
New Contributor II

No worries, it’s always the small details. Glad it worked out!

erichughes
Contributor II

Here is the EA we use. Not sure where I got it but I didn't create it. We haven't had any issues with it or the older script.

#!/bin/bash
# This script is used as an extension attribute and compares
# the IT installer version on the Zoom site vs what the user is running
if [ ! -d "/Applications/zoom.us.app" ]; then
echo "<result>Not Installed</result>"
exit 0

else

# Determine current OS version to pass to user string
OSvers_URL=$( sw_vers -productVersion | sed 's/[.]/_/g' )
# Create useragent to pass into curl command
userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X ${OSvers_URL}) AppleWebKit/535.6.2 (KHTML, like Gecko) Version/5.2 Safari/535.6.2"
# Pull current available version of Zoom from their site
latestver=`/usr/bin/curl -s -A "$userAgent" https://zoom.us/download | grep 'ZoomInstallerIT.pkg' | awk -F'/' '{print $3}'`
# Get current version installed on computer
installedVersion=$( defaults read /Applications/zoom.us.app/Contents/Info.plist CFBundleVersion )
# Compare zoom version vs installed version, print result

if [ "$latestver" == "$installedVersion" ]; then
echo "<result>Latest</result>"
exit 0
else
echo "<result>Old</result>"
exit 0
fi
fi

kwoodard
Contributor III

I am new to EA's and how to get them to "do" anything. So if I am understanding right, you all have an EA setup that checks the version of Zoom on an endpoint and compares it to the current version. Then it moves the endpoint into a smart group that triggers the update script (from I assume is a different policy). How is that accomplished...the moving of endpoints into a smart group?

talkingmoose
Honored Contributor II
Honored Contributor II

When you create an extension attribute with a Display Name like “Antivirus Definitions Date”, that display name then becomes a new criterion you can add to a smart group.

From there, you can set your smart group rule to something like “Antivirus Definitions Date” is greater than “2022-09-02” and you’ll have a list of all devices that match that rule.

So then this is something I would have to manually update whenever a new version comes out? Is there a way to automate this group creation? Zoom seems to have been doing updates at least once a month for a while, with times where it seemed almost every other day there was a new version. This doesn't seem beneficial if I have to always go in to adjust the smart group rule to reflect whatever the current version of the software is.

That might work. Set the plist to drop into the tmp folder first, then have the script run after that downloads and runs the install afterwards.

greatkemo
Contributor

Hi Folks, 

Thought I would join in the fun.  Another way to fix and get the latest version is using the following:

 

DOWNLOAD_URL=$(curl -si https://zoom.us/client/latest/ZoomInstallerIT.pkg | awk '/location: /{print $2}')
LATEST_VERSION=$(perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' <<< "$ZOOM_DOWNLOAD_URL")

 

 

Fewer curls, and faffing around with user agents, etc.

Hope it helps.

Kamal

pbileci
New Contributor III

That works. Now if only I can edit the script...

It seems to be working for me now...