diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..1aaf739 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +## v0.3 - 2020-07- + +- added several new labels for total of 98 +- removed the powershell labels, since the installer is not notarized +- when run without any arguments, the script now lists all labels +- changed how zips are expanded because this was broken on Mojave +- improved logging in some statements +- several more minor improvements + +## v0.2 - 2020-06-09 + +- many fixes for broken URLs and other bugs +- the `pkgInDmg` and `pkgInZip` now search for a pkg file in the archive in case the file name varies with the version +- notification on successful installation can be suppressed with the `NOTIFY` variable +- Apple signed installers and apps that don’t have a Team ID are verified correctly now +improved logging +- several new applications: count increased from 62 in 0.1 to 87 in 0.2 + +## v0.1 - 2020-05-12 \ No newline at end of file diff --git a/Installomator.sh b/Installomator.sh index 8d29985..4e84dda 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -8,12 +8,12 @@ # inspired by the download scripts from William Smith and Sander Schram # with additional ideas and contribution from Isaac Ordonez, Mann consulting -VERSION='0.2' -VERSIONDATE='20200529' +VERSION='0.3' +VERSIONDATE='20200609' export PATH=/usr/bin:/bin:/usr/sbin:/sbin -# adjust these variables: +# NOTE: adjust these variables: # set to 0 for production, 1 for debugging # while debugging, items will be downloaded to the parent directory of this script @@ -38,6 +38,8 @@ BLOCKING_PROCESS_ACTION=prompt_user # - kill kill process without prompting or giving the user a chance to save +# NOTE: How labels work + # Each workflow label needs to be listed in the case statement below. # for each label these variables can be set: # @@ -110,16 +112,8 @@ BLOCKING_PROCESS_ACTION=prompt_user # When this variable is set (any value), $updateTool will be run as the current user. # -# todos: -# TODO: better logging (or, really, any logging other than echo) -# TODO: generic function Sparkle to get latest download -# TODO: ?notify user of errors -# TODO: ?generic function to initiate a Sparkle Update -# TODO: better version retrieval and reporting, before and after install - - -# functions to help with getting info +# MARK: functions to help with getting data # Logging log_location="/private/var/log/Installomator.log" @@ -156,7 +150,7 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name | awk -F '"' "/browser_download_url/ && /$filetype/ { print \$4 }") fi if [ -z "$downloadURL" ]; then - echo "could not retrieve download URL for $gitusername/$gitreponame" + printlog "could not retrieve download URL for $gitusername/$gitreponame" exit 9 else echo "$downloadURL" @@ -164,12 +158,19 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name fi } -printlog "################## Start Installomator" -# get the label +# MARK: check minimal macOS requirement +autoload is-at-least + +if ! is-at-least 10.14 $(sw_vers -productVersion); then + printlog "Installomator requires at least macOS 10.14 Mojave." + exit 98 +fi + +# MARK: get the label if [[ $# -eq 0 ]]; then - printlog "no label provided" - exit 1 + grep -E '^[a-z0-9\-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^broken' | grep -v -E '^(longversion|version)$' | sort + exit 0 elif [[ $# -gt 3 ]]; then # jamf uses $4 for the first custom parameter printlog "shifting arguments for Jamf" @@ -178,6 +179,7 @@ fi label=${1:?"no label provided"} +printlog "################## Start Installomator" printlog "################## $label" # lowercase the label @@ -187,697 +189,794 @@ label=${label:l} currentUser=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }') -# labels in case statement +# MARK: labels in case statement case $label in - version) - # print the script VERSION - printlog "$VERSION" - exit 0 - ;; - longversion) - # print the script version - printlog "Installomater: version $VERSION ($VERSIONDATE)" - exit 0 - ;; +version) + # print the script VERSION + printlog "$VERSION" + exit 0 + ;; +longversion) + # print the script version + printlog "Installomater: version $VERSION ($VERSIONDATE)" + exit 0 + ;; - # label descriptions start here - autodmg) - # credit: Mischa van der Bent (@mischavdbent) - name="AutoDMG" - type="dmg" - downloadURL=$(downloadURLFromGit MagerValp AutoDMG) - expectedTeamID="5KQ3D3FG5H" - ;; - googlechrome) - name="Google Chrome" - type="dmg" - downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; - googlechromepkg) - name="Google Chrome" - type="pkg" - downloadURL="https://dl.google.com/chrome/mac/stable/gcem/GoogleChrome.pkg" - expectedTeamID="EQHXZ8M8AV" - updateTool="/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/MacOS/GoogleSoftwareUpdateAgent" - updateToolArguments=( -runMode oneshot -userInitiated YES ) - updateToolRunAsCurrentUser=1 - ;; - googlejapaneseinput) - # credit: Tadayuki Onishi (@kenchan0130) - name="GoogleJapaneseInput" - type="pkgInDmg" - pkgName="GoogleJapaneseInput.pkg" - downloadURL="https://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; - santa) - # credit: Tadayuki Onishi (@kenchan0130) - name="Santa" - type="pkgInDmg" - downloadURL=$(downloadURLFromGit google santa) - expectedTeamID="EQHXZ8M8AV" - ;; - spotify) - name="Spotify" - type="dmg" - downloadURL="https://download.scdn.co/Spotify.dmg" - expectedTeamID="2FNC3A47ZF" - ;; - bbedit) - name="BBEdit" - type="dmg" - downloadURL=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort | tail -n1 | cut -d">" -f2 | cut -d"<" -f1) - expectedTeamID="W52GZAXT98" - ;; - firefox) - name="Firefox" - type="dmg" - downloadURL="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" - expectedTeamID="43AQ936H96" - blockingProcesses=( firefox ) - ;; - firefoxpkg) - name="Firefox" - type="pkg" - downloadURL="https://download.mozilla.org/?product=firefox-pkg-latest-ssl&os=osx&lang=en-US" - expectedTeamID="43AQ936H96" - blockingProcesses=( firefox ) - ;; - firefoxesrpkg) - name="Firefox" - type="pkg" - downloadURL="https://download.mozilla.org/?product=firefox-esr-pkg-latest-ssl&os=osx" - expectedTeamID="43AQ936H96" - blockingProcesses=( firefox ) - ;; - whatsapp) - name="WhatsApp" - type="dmg" - downloadURL="https://web.whatsapp.com/desktop/mac/files/WhatsApp.dmg" - expectedTeamID="57T9237FN3" - ;; - desktoppr) - name="desktoppr" - type="pkg" - downloadURL=$(downloadURLFromGit "scriptingosx" "desktoppr") - expectedTeamID="JME5BW3F3R" - blockingProcesses=( NONE ) - ;; - malwarebytes) - name="Malwarebytes" - type="pkg" - downloadURL="https://downloads.malwarebytes.com/file/mb3-mac" - expectedTeamID="GVZRY6KDKR" - ;; - suspiciouspackage) - # credit: Mischa van der Bent (@mischavdbent) - name="Suspicious Package" - type="dmg" - downloadURL="https://mothersruin.com/software/downloads/SuspiciousPackage.dmg" - expectedTeamID="936EB786NH" - ;; - atom) - name="Atom" - type="zip" - archiveName="atom-mac.zip" - downloadURL=$(downloadURLFromGit atom atom ) - expectedTeamID="VEKTX9H2N7" - ;; - eraseinstall) - name="EraseInstall" - type="pkg" - downloadURL=https://bitbucket.org$(curl -fs https://bitbucket.org/prowarehouse-nl/erase-install/downloads/ | grep pkg | cut -d'"' -f2 | head -n 1) - expectedTeamID="R55HK5K86Y" - ;; - omnigraffle7) - name="OmniGraffle" - type="dmg" - downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniGraffle7" \ - | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="34YW5XSRB7" - ;; - omnifocus3) - name="OmniFocus" - type="dmg" - downloadURL=$(curl -fs https://update.omnigroup.com/appcast/com.omnigroup.OmniFocus3 \ - | xpath '//rss/channel/item/enclosure[1]/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="34YW5XSRB7" - ;; - vlc) - name="VLC" - type="dmg" - downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml \ - | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) - expectedTeamID="75GAHG3SZQ" - ;; - textmate) - name="TextMate" - type="tbz" - downloadURL="https://api.textmate.org/downloads/release?os=10.12" - expectedTeamID="45TL96F76G" - ;; - depnotify) - name="DEPNotify" - type="zip" - downloadURL="https://files.nomad.menu/DEPNotify.zip" - expectedTeamID="VRPY9KHGX6" - targetDir="/Applications/Utilities" - ;; - tunnelbear) - name="TunnelBear" - type="zip" - downloadURL="https://s3.amazonaws.com/tunnelbear/downloads/mac/TunnelBear.zip" - expectedTeamID="P2PHZ9K5JJ" - ;; - sourcetree) - name="Sourcetree" - type="zip" - downloadURL=$(curl -fs https://product-downloads.atlassian.com/software/sourcetree/Appcast/SparkleAppcastAlpha.xml \ - | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null \ - | cut -d '"' -f 2 ) - expectedTeamID="UPXU4CQZ5P" - ;; - boxdrive) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Box" - type="pkg" - downloadURL="https://e3.boxcdn.net/box-installers/desktop/releases/mac/Box.pkg" - expectedTeamID="M683GB7CPW" - ;; - aviatrix) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Aviatrix VPN Client" - type="pkg" - downloadURL="https://s3-us-west-2.amazonaws.com/aviatrix-download/AviatrixVPNClient/AVPNC_mac.pkg" - expectedTeamID="32953Z7NBN" - ;; - zoom) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Zoom.us" - type="pkg" - downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg" - expectedTeamID="BJ4HAAB9B3" - blockingProcesses=( zoom.us ) - ;; - sonos) - # credit: Erik Stam (@erikstam) - name="Sonos" - type="dmg" - downloadURL="https://www.sonos.com/redir/controller_software_mac" - expectedTeamID="2G4LW83Q3E" - ;; - coderunner) - # credit: Erik Stam (@erikstam) - name="CodeRunner" - type="zip" - downloadURL="https://coderunnerapp.com/download" - expectedTeamID="R4GD98AJF9" - ;; - openvpnconnect) - # credit: Erik Stam (@erikstam) - name="OpenVPN" - type="pkgInDmg" - pkgName="OpenVPN_Connect_Installer_signed.pkg" - downloadURL="https://openvpn.net/downloads/openvpn-connect-v2-macos.dmg" - expectedTeamID="ACV7L3WCD8" - ;; - pacifist) - name="Pacifist" - type="dmg" - downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg" - expectedTeamID="HRLUCP7QP4" - ;; - 1password7) - name="1Password 7" - type="pkg" - downloadURL="https://app-updates.agilebits.com/download/OPM7" - expectedTeamID="2BUA8C4S2C" - ;; - webexmeetings) - # credit: Erik Stam (@erikstam) - name="Cisco Webex Meetings" - type="pkgInDmg" - downloadURL="https://akamaicdn.webex.com/client/webexapp.dmg" - expectedTeamID="DE8Y96K9QP" - ;; - webexteams) - # credit: Erik Stam (@erikstam) - name="Webex Teams" - type="dmg" - downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg" - expectedTeamID="DE8Y96K9QP" - ;; - citrixworkspace) - # credit: Erik Stam (@erikstam) updated by Phinehas Bynum (@phinbox) - name="Citrix Workspace" - type="pkgInDmg" - downloadURL=$(curl -s https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html \ - | grep -m1 -o --regexp="downloads.citrix.com/[0-9]\{5\}\/CitrixWorkspaceApp.dmg?__gda__=[0-9a-f_]*" \ - | sed 's/^/https:\/\//') - expectedTeamID="S272Y5R93J" - ;; - privileges) - # credit: Erik Stam (@erikstam) - name="Privileges" - type="zip" - downloadURL=$(downloadURLFromGit sap macOS-enterprise-privileges ) - expectedTeamID="7R5ZEU67FQ" - ;; - icons) - # credit: Mischa van der Bent (@mischavdbent) - name="Icons" - type="zip" - downloadURL=$(downloadURLFromGit sap macOS-icon-generator ) - expectedTeamID="7R5ZEU67FQ" - ;; - googledrivefilestream) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Google Drive File Stream" - type="pkgInDmg" - downloadURL="https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg" - pkgName="GoogleDriveFileStream.pkg" - expectedTeamID="EQHXZ8M8AV" - ;; - plisteditpro) - name="PlistEdit Pro" - type="zip" - downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip" - expectedTeamID="8NQ43ND65V" - ;; - slack) - name="Slack" - type="dmg" - downloadURL="https://slack.com/ssb/download-osx" - expectedTeamID="BQR82RBBHL" - ;; - sublimetext) - # credit: Mischa van der Bent (@mischavdbent) - name="Sublime Text" - type="dmg" - downloadURL="https://download.sublimetext.com/latest/stable/osx" - expectedTeamID="Z6D26JE4Y4" - ;; - githubdesktop) - name="GitHub Desktop" - type="zip" - downloadURL="https://central.github.com/deployments/desktop/desktop/latest/darwin" - expectedTeamID="VEKTX9H2N7" - ;; - things) - name="Things" - type="zip" - downloadURL="https://culturedcode.com/things/download/" - expectedTeamID="JLMPQHK86H" - ;; - discord) - name="Discord" - type="dmg" - downloadURL="https://discordapp.com/api/download?platform=osx" - expectedTeamID="53Q6R32WPB" - ;; - grandperspective) - name="GrandPerspective" - type="dmg" - downloadURL="https://sourceforge.net/projects/grandperspectiv/files/latest/download" - expectedTeamID="3Z75QZGN66" - ;; - handbrake) - name="HandBrake" - type="dmg" - downloadURL=$(curl --silent --fail "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" \ - | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ { print \$4 }") - expectedTeamID="5X9DE89KYV" - ;; - netnewswire) - name="NetNewsWire" - type="zip" - downloadURL=$(curl -fs https://ranchero.com/downloads/netnewswire-release.xml \ - | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="M8L2WTLA8W" - ;; - resiliosynchome) - name="Resilio Sync" - type="dmg" - downloadURL="https://download-cdn.resilio.com/stable/osx/Resilio-Sync.dmg" - expectedTeamID="2953Z5SZSK" - ;; - cyberduck) - name="Cyberduck" - type="zip" - downloadURL=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) - expectedTeamID="G69SCX94XU" - ;; - dropbox) - name="Dropbox" - type="dmg" - downloadURL="https://www.dropbox.com/download?plat=mac&full=1" - expectedTeamID="G7HH3F8CAK" - ;; - teamviewer) - name="TeamViewer" - type="pkgInDmg" - pkgName="Install TeamViewer.pkg" - downloadURL="https://download.teamviewer.com/download/TeamViewer.dmg" - expectedTeamID="H7UGFBUGV6" - ;; - iterm2) - name="iTerm" - type="zip" - downloadURL="https://iterm2.com/downloads/stable/latest" - expectedTeamID="H7V7XYVQ7D" - ;; - royaltsx) - name="Royal TSX" - type="dmg" - downloadURL=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="VXP8K9EDP6" - ;; - appcleaner) - # credit: Tadayuki Onishi (@kenchan0130) - name="AppCleaner" - type="zip" - downloadURL=$(curl -fs https://freemacsoft.net/appcleaner/Updates.xml | xpath '//rss/channel/*/enclosure/@url' 2>/dev/null | tr " " "\n" | sort | tail -1 | cut -d '"' -f 2) - expectedTeamID="X85ZX835W9" - ;; - karabinerelements) - # credit: Tadayuki Onishi (@kenchan0130) - name="Karabiner-Elements" - type="pkgInDmg" - downloadURL=$(downloadURLFromGit pqrs-org Karabiner-Elements) - expectedTeamID="G43BCU2T37" - ;; - postman) - # credit: Mischa van der Bent - name="Postman" - type="zip" - downloadURL="https://dl.pstmn.io/download/latest/osx" - expectedTeamID="H7H8Q7M5CK" - ;; - jamfpppcutility) - # credit: Mischa van der Bent - name="PPPC Utility" - type="zip" - downloadURL=$(downloadURLFromGit jamf PPPC-Utility) - expectedTeamID="483DWKW443" - ;; - jamfmigrator) - # credit: Mischa van der Bent - name="jamf-migrator" - type="zip" - downloadURL=$(downloadURLFromGit jamf JamfMigrator) - expectedTeamID="PS2F6S478M" - ;; - jamfreenroller) - # credit: Mischa van der Bent - name="ReEnroller" - type="zip" - downloadURL=$(downloadURLFromGit jamf ReEnroller) - expectedTeamID="PS2F6S478M" - ;; - adobereaderdc) - name="Adobe Acrobat Reader DC" - type="pkgInDmg" - downloadURL=$(adobecurrent=`curl -s https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.'` && echo http://ardownload.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDC_"$adobecurrent"_MUI.dmg) - expectedTeamID="JQ525L2MZD" - blockingProcesses=( "AdobeReader" ) - ;; - signal) - # credit: Søren Theilgaard - name="Signal" - type="dmg" - downloadURL=https://updates.signal.org/desktop/$(curl -fs https://updates.signal.org/desktop/latest-mac.yml | awk '/url/ && /dmg/ {print $3}') - expectedTeamID="U68MSDN6DR" - ;; - docker) - # credit: @securitygeneration - name="Docker" - type="dmg" - downloadURL="https://download.docker.com/mac/stable/Docker.dmg" - expectedTeamID="9BNSXJN65R" - ;; - brave) - # credit: @securitygeneration - name="Brave Browser" - type="dmg" - downloadURL="https://laptop-updates.brave.com/latest/osx" - expectedTeamID="9BNSXJN65R" - ;; - umbrellaroamingclient) - # credit: Tadayuki Onishi (@kenchan0130) - name="Umbrella Roaming Client" - type="pkgInZip" - downloadURL=https://disthost.umbrella.com/roaming/upgrade/mac/production/$( curl -fsL https://disthost.umbrella.com/roaming/upgrade/mac/production/manifest.json | awk -F '"' '/"downloadFilename"/ { print $4 }' ) - expectedTeamID="7P7HQ8H646" - ;; - powershell) - # credit: Tadayuki Onishi (@kenchan0130) - name="PowerShell" - type="pkg" - downloadURL=$(curl -fs "https://api.github.com/repos/Powershell/Powershell/releases/latest" \ - | awk -F '"' '/browser_download_url/ && /pkg/ { print $4 }' | grep -v lts ) - expectedTeamID="UBF8T346G9" - ;; - powershell-lts) - # credit: Tadayuki Onishi (@kenchan0130) - name="PowerShell" - type="pkg" - downloadURL=$(curl -fs "https://api.github.com/repos/Powershell/Powershell/releases/latest" \ - | awk -F '"' '/browser_download_url/ && /pkg/ { print $4 }' | grep lts) - expectedTeamID="UBF8T346G9" - ;; - wwdcformac) - name="WWDC" - type="zip" - downloadURL="https://cdn.wwdc.io/WWDC_latest.zip" - expectedTeamID="8C7439RJLG" - ;; - ringcentralmeetings) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Ring Central Meetings" - type="pkg" - downloadURL="http://dn.ringcentral.com/data/web/download/RCMeetings/1210/RCMeetingsClientSetup.pkg" - expectedTeamID="M932RC5J66" - blockingProcesses=( "RingCentral Meetings" ) - ;; - ringcentralapp) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Glip" - type="dmg" - downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac" - expectedTeamID="M932RC5J66" - blockingProcesses=( "Glip" ) - ;; - sfsymbols) - name="SF Symbols" - type="pkgInDmg" - downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg" - expectedTeamID="Software Update" - ;; - swiftruntimeforcommandlinetools) - # Note: this installer will error on macOS versions later than 10.14.3 - name="SwiftRuntimeForCommandLineTools" - type="pkgInDmg" - downloadURL="https://updates.cdn-apple.com/2019/cert/061-41823-20191025-5efc5a59-d7dc-46d3-9096-396bb8cb4a73/SwiftRuntimeForCommandLineTools.dmg" - expectedTeamID="Software Update" - ;; +# label descriptions start here +autodmg) + # credit: Mischa van der Bent (@mischavdbent) + name="AutoDMG" + type="dmg" + downloadURL=$(downloadURLFromGit MagerValp AutoDMG) + expectedTeamID="5KQ3D3FG5H" + ;; +googlechrome) + name="Google Chrome" + type="dmg" + downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + expectedTeamID="EQHXZ8M8AV" + ;; +googlechromepkg) + name="Google Chrome" + type="pkg" + # + # Note: this url acknowledges that you accept the terms of service + # https://support.google.com/chrome/a/answer/9915669 + # + downloadURL="https://dl.google.com/chrome/mac/stable/accept_tos%3Dhttps%253A%252F%252Fwww.google.com%252Fintl%252Fen_ph%252Fchrome%252Fterms%252F%26_and_accept_tos%3Dhttps%253A%252F%252Fpolicies.google.com%252Fterms/googlechrome.pkg" + expectedTeamID="EQHXZ8M8AV" + updateTool="/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/MacOS/GoogleSoftwareUpdateAgent" + updateToolArguments=( -runMode oneshot -userInitiated YES ) + updateToolRunAsCurrentUser=1 + ;; +googlejapaneseinput) + # credit: Tadayuki Onishi (@kenchan0130) + name="GoogleJapaneseInput" + type="pkgInDmg" + pkgName="GoogleJapaneseInput.pkg" + downloadURL="https://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg" + expectedTeamID="EQHXZ8M8AV" + ;; +santa) + # credit: Tadayuki Onishi (@kenchan0130) + name="Santa" + type="pkgInDmg" + downloadURL=$(downloadURLFromGit google santa) + expectedTeamID="EQHXZ8M8AV" + ;; +spotify) + name="Spotify" + type="dmg" + downloadURL="https://download.scdn.co/Spotify.dmg" + expectedTeamID="2FNC3A47ZF" + ;; +bbedit) + name="BBEdit" + type="dmg" + downloadURL=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort | tail -n1 | cut -d">" -f2 | cut -d"<" -f1) + expectedTeamID="W52GZAXT98" + ;; +firefox) + name="Firefox" + type="dmg" + downloadURL="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" + expectedTeamID="43AQ936H96" + blockingProcesses=( firefox ) + ;; +firefoxpkg) + name="Firefox" + type="pkg" + downloadURL="https://download.mozilla.org/?product=firefox-pkg-latest-ssl&os=osx&lang=en-US" + expectedTeamID="43AQ936H96" + blockingProcesses=( firefox ) + ;; +firefoxesrpkg) + name="Firefox" + type="pkg" + downloadURL="https://download.mozilla.org/?product=firefox-esr-pkg-latest-ssl&os=osx" + expectedTeamID="43AQ936H96" + blockingProcesses=( firefox ) + ;; +whatsapp) + name="WhatsApp" + type="dmg" + downloadURL="https://web.whatsapp.com/desktop/mac/files/WhatsApp.dmg" + expectedTeamID="57T9237FN3" + ;; +desktoppr) + name="desktoppr" + type="pkg" + downloadURL=$(downloadURLFromGit "scriptingosx" "desktoppr") + expectedTeamID="JME5BW3F3R" + blockingProcesses=( NONE ) + ;; +malwarebytes) + name="Malwarebytes" + type="pkg" + downloadURL="https://downloads.malwarebytes.com/file/mb3-mac" + expectedTeamID="GVZRY6KDKR" + ;; +suspiciouspackage) + # credit: Mischa van der Bent (@mischavdbent) + name="Suspicious Package" + type="dmg" + downloadURL="https://mothersruin.com/software/downloads/SuspiciousPackage.dmg" + expectedTeamID="936EB786NH" + ;; +atom) + name="Atom" + type="zip" + archiveName="atom-mac.zip" + downloadURL=$(downloadURLFromGit atom atom ) + expectedTeamID="VEKTX9H2N7" + ;; +eraseinstall) + name="EraseInstall" + type="pkg" + downloadURL=https://bitbucket.org$(curl -fs https://bitbucket.org/prowarehouse-nl/erase-install/downloads/ | grep pkg | cut -d'"' -f2 | head -n 1) + expectedTeamID="R55HK5K86Y" + ;; +omnigraffle7) + name="OmniGraffle" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniGraffle7" \ + | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="34YW5XSRB7" + ;; +omnifocus3) + name="OmniFocus" + type="dmg" + downloadURL=$(curl -fs https://update.omnigroup.com/appcast/com.omnigroup.OmniFocus3 \ + | xpath '//rss/channel/item/enclosure[1]/@url' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="34YW5XSRB7" + ;; +vlc) + name="VLC" + type="dmg" + downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml \ + | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) + expectedTeamID="75GAHG3SZQ" + ;; +textmate) + name="TextMate" + type="tbz" + downloadURL="https://api.textmate.org/downloads/release?os=10.12" + expectedTeamID="45TL96F76G" + ;; +depnotify) + name="DEPNotify" + type="zip" + downloadURL="https://files.nomad.menu/DEPNotify.zip" + expectedTeamID="VRPY9KHGX6" + targetDir="/Applications/Utilities" + ;; +tunnelbear) + name="TunnelBear" + type="zip" + downloadURL="https://s3.amazonaws.com/tunnelbear/downloads/mac/TunnelBear.zip" + expectedTeamID="P2PHZ9K5JJ" + ;; +sourcetree) + name="Sourcetree" + type="zip" + downloadURL=$(curl -fs https://product-downloads.atlassian.com/software/sourcetree/Appcast/SparkleAppcastAlpha.xml \ + | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null \ + | cut -d '"' -f 2 ) + expectedTeamID="UPXU4CQZ5P" + ;; +boxdrive) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Box" + type="pkg" + downloadURL="https://e3.boxcdn.net/box-installers/desktop/releases/mac/Box.pkg" + expectedTeamID="M683GB7CPW" + ;; +aviatrix) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Aviatrix VPN Client" + type="pkg" + downloadURL="https://s3-us-west-2.amazonaws.com/aviatrix-download/AviatrixVPNClient/AVPNC_mac.pkg" + expectedTeamID="32953Z7NBN" + ;; +zoom) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Zoom.us" + type="pkg" + downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg" + expectedTeamID="BJ4HAAB9B3" + blockingProcesses=( zoom.us ) + ;; +sonos|\ +sonoss1) + # credit: Erik Stam (@erikstam) + name="Sonos S1 Controller" + type="dmg" + downloadURL="https://www.sonos.com/redir/controller_software_mac" + expectedTeamID="2G4LW83Q3E" + ;; +sonoss2) + name="Sonos" + type="dmg" + downloadURL="https://www.sonos.com/redir/controller_software_mac2" + expectedTeamID="2G4LW83Q3E" + ;; +coderunner) + # credit: Erik Stam (@erikstam) + name="CodeRunner" + type="zip" + downloadURL="https://coderunnerapp.com/download" + expectedTeamID="R4GD98AJF9" + ;; +openvpnconnect) + # credit: Erik Stam (@erikstam) + name="OpenVPN" + type="pkgInDmg" + pkgName="OpenVPN_Connect_Installer_signed.pkg" + downloadURL="https://openvpn.net/downloads/openvpn-connect-v2-macos.dmg" + expectedTeamID="ACV7L3WCD8" + ;; +pacifist) + name="Pacifist" + type="dmg" + downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg" + expectedTeamID="HRLUCP7QP4" + ;; +1password7) + name="1Password 7" + type="pkg" + downloadURL="https://app-updates.agilebits.com/download/OPM7" + expectedTeamID="2BUA8C4S2C" + ;; +webexmeetings) + # credit: Erik Stam (@erikstam) + name="Cisco Webex Meetings" + type="pkgInDmg" + downloadURL="https://akamaicdn.webex.com/client/webexapp.dmg" + expectedTeamID="DE8Y96K9QP" + ;; +webexteams) + # credit: Erik Stam (@erikstam) + name="Webex Teams" + type="dmg" + downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg" + expectedTeamID="DE8Y96K9QP" + ;; +#citrixworkspace) + # credit: Erik Stam (@erikstam) + #name="Citrix Workspace" + #type="pkgInDmg" + #downloadURL="https://downloads.citrix.com/17596/CitrixWorkspaceApp.dmg?__gda__=1588183500_fc68033aef7d6d163d8b8309b964f1de" + #expectedTeamID="S272Y5R93J" + #;; +privileges) + # credit: Erik Stam (@erikstam) + name="Privileges" + type="zip" + downloadURL=$(downloadURLFromGit sap macOS-enterprise-privileges ) + expectedTeamID="7R5ZEU67FQ" + ;; +icons) + # credit: Mischa van der Bent (@mischavdbent) + name="Icons" + type="zip" + downloadURL=$(downloadURLFromGit sap macOS-icon-generator ) + expectedTeamID="7R5ZEU67FQ" + ;; +googledrivefilestream) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Google Drive File Stream" + type="pkgInDmg" + downloadURL="https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg" + pkgName="GoogleDriveFileStream.pkg" + expectedTeamID="EQHXZ8M8AV" + ;; +plisteditpro) + name="PlistEdit Pro" + type="zip" + downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip" + expectedTeamID="8NQ43ND65V" + ;; +slack) + name="Slack" + type="dmg" + downloadURL="https://slack.com/ssb/download-osx" + expectedTeamID="BQR82RBBHL" + ;; +sublimetext) + # credit: Mischa van der Bent (@mischavdbent) + name="Sublime Text" + type="dmg" + downloadURL="https://download.sublimetext.com/latest/stable/osx" + expectedTeamID="Z6D26JE4Y4" + ;; +githubdesktop) + name="GitHub Desktop" + type="zip" + downloadURL="https://central.github.com/deployments/desktop/desktop/latest/darwin" + expectedTeamID="VEKTX9H2N7" + ;; +things) + name="Things" + type="zip" + downloadURL="https://culturedcode.com/things/download/" + expectedTeamID="JLMPQHK86H" + ;; +discord) + name="Discord" + type="dmg" + downloadURL="https://discordapp.com/api/download?platform=osx" + expectedTeamID="53Q6R32WPB" + ;; +grandperspective) + name="GrandPerspective" + type="dmg" + downloadURL="https://sourceforge.net/projects/grandperspectiv/files/latest/download" + expectedTeamID="3Z75QZGN66" + ;; +handbrake) + name="HandBrake" + type="dmg" + downloadURL=$(curl --silent --fail "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" \ + | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ { print \$4 }") + expectedTeamID="5X9DE89KYV" + ;; +netnewswire) + name="NetNewsWire" + type="zip" + downloadURL=$(curl -fs https://ranchero.com/downloads/netnewswire-release.xml \ + | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="M8L2WTLA8W" + ;; +resiliosynchome) + name="Resilio Sync" + type="dmg" + downloadURL="https://download-cdn.resilio.com/stable/osx/Resilio-Sync.dmg" + expectedTeamID="2953Z5SZSK" + ;; +cyberduck) + name="Cyberduck" + type="zip" + downloadURL=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) + expectedTeamID="G69SCX94XU" + ;; +dropbox) + name="Dropbox" + type="dmg" + downloadURL="https://www.dropbox.com/download?plat=mac&full=1" + expectedTeamID="G7HH3F8CAK" + ;; +teamviewer) + name="TeamViewer" + type="pkgInDmg" + pkgName="Install TeamViewer.pkg" + downloadURL="https://download.teamviewer.com/download/TeamViewer.dmg" + expectedTeamID="H7UGFBUGV6" + ;; +iterm2) + name="iTerm" + type="zip" + downloadURL="https://iterm2.com/downloads/stable/latest" + expectedTeamID="H7V7XYVQ7D" + blockingProcesses=( iTerm2 ) + ;; +royaltsx) + name="Royal TSX" + type="dmg" + downloadURL=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="VXP8K9EDP6" + ;; +appcleaner) + # credit: Tadayuki Onishi (@kenchan0130) + name="AppCleaner" + type="zip" + downloadURL=$(curl -fs https://freemacsoft.net/appcleaner/Updates.xml | xpath '//rss/channel/*/enclosure/@url' 2>/dev/null | tr " " "\n" | sort | tail -1 | cut -d '"' -f 2) + expectedTeamID="X85ZX835W9" + ;; +karabinerelements) + # credit: Tadayuki Onishi (@kenchan0130) + name="Karabiner-Elements" + type="pkgInDmg" + downloadURL=$(downloadURLFromGit pqrs-org Karabiner-Elements) + expectedTeamID="G43BCU2T37" + ;; +postman) + # credit: Mischa van der Bent + name="Postman" + type="zip" + downloadURL="https://dl.pstmn.io/download/latest/osx" + expectedTeamID="H7H8Q7M5CK" + ;; +jamfpppcutility) + # credit: Mischa van der Bent + name="PPPC Utility" + type="zip" + downloadURL=$(downloadURLFromGit jamf PPPC-Utility) + expectedTeamID="483DWKW443" + ;; +jamfmigrator) + # credit: Mischa van der Bent + name="jamf-migrator" + type="zip" + downloadURL=$(downloadURLFromGit jamf JamfMigrator) + expectedTeamID="PS2F6S478M" + ;; +jamfreenroller) + # credit: Mischa van der Bent + name="ReEnroller" + type="zip" + downloadURL=$(downloadURLFromGit jamf ReEnroller) + expectedTeamID="PS2F6S478M" + ;; +adobereaderdc|\ +adobereaderdc-install) + name="Adobe Acrobat Reader DC" + type="pkgInDmg" + downloadURL=$(curl --silent --fail -H "Sec-Fetch-Site: same-origin" -H "Accept-Encoding: gzip, deflate, br" -H "Accept-Language: en-US;q=0.9,en;q=0.8" -H "DNT: 1" -H "Sec-Fetch-Mode: cors" -H "X-Requested-With: XMLHttpRequest" -H "Referer: https://get.adobe.com/reader/enterprise/" -H "Accept: */*" "https://get.adobe.com/reader/webservices/json/standalone/?platform_type=Macintosh&platform_dist=OSX&platform_arch=x86-32&language=English&eventname=readerotherversions" | grep -Eo '"download_url":.*?[^\\]",' | head -n 1 | cut -d \" -f 4) + expectedTeamID="JQ525L2MZD" + blockingProcesses=( "AdobeReader" ) + ;; +adobereaderdc-update) + name="Adobe Acrobat Reader DC" + type="pkgInDmg" + downloadURL=$(adobecurrent=`curl --fail --silent https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt | tr -d '.'` && echo http://ardownload.adobe.com/pub/adobe/reader/mac/AcrobatDC/"$adobecurrent"/AcroRdrDCUpd"$adobecurrent"_MUI.dmg) + expectedTeamID="JQ525L2MZD" + blockingProcesses=( "AdobeReader" ) + ;; +signal) + # credit: Søren Theilgaard + name="Signal" + type="dmg" + downloadURL=https://updates.signal.org/desktop/$(curl -fs https://updates.signal.org/desktop/latest-mac.yml | awk '/url/ && /dmg/ {print $3}') + expectedTeamID="U68MSDN6DR" + ;; +docker) + # credit: @securitygeneration + name="Docker" + type="dmg" + downloadURL="https://download.docker.com/mac/stable/Docker.dmg" + expectedTeamID="9BNSXJN65R" + ;; +brave) + # credit: @securitygeneration + name="Brave Browser" + type="dmg" + downloadURL="https://laptop-updates.brave.com/latest/osx" + expectedTeamID="9BNSXJN65R" + ;; +umbrellaroamingclient) + # credit: Tadayuki Onishi (@kenchan0130) + name="Umbrella Roaming Client" + type="pkgInZip" + downloadURL=https://disthost.umbrella.com/roaming/upgrade/mac/production/$( curl -fsL https://disthost.umbrella.com/roaming/upgrade/mac/production/manifest.json | awk -F '"' '/"downloadFilename"/ { print $4 }' ) + expectedTeamID="7P7HQ8H646" + ;; +# TODO: vmwarefusion installation process needs testing +# vmwarefusion) +# # credit: Erik Stam (@erikstam) +# name="VMware Fusion" +# type="dmg" +# downloadURL="https://www.vmware.com/go/getfusion" +# expectedTeamID="EG7KH642X6" +# ;; + +# NOTE: powershell installers are not notarized +# powershell) +# # credit: Tadayuki Onishi (@kenchan0130) +# name="PowerShell" +# type="pkg" +# downloadURL=$(curl -fs "https://api.github.com/repos/Powershell/Powershell/releases/latest" \ +# | awk -F '"' '/browser_download_url/ && /pkg/ { print $4 }' | grep -v lts ) +# expectedTeamID="UBF8T346G9" +# ;; +# powershell-lts) +# # credit: Tadayuki Onishi (@kenchan0130) +# name="PowerShell" +# type="pkg" +# downloadURL=$(curl -fs "https://api.github.com/repos/Powershell/Powershell/releases/latest" \ +# | awk -F '"' '/browser_download_url/ && /pkg/ { print $4 }' | grep lts) +# expectedTeamID="UBF8T346G9" +# ;; + +wwdcformac) + name="WWDC" + type="zip" + downloadURL="https://cdn.wwdc.io/WWDC_latest.zip" + expectedTeamID="8C7439RJLG" + ;; +ringcentralmeetings) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Ring Central Meetings" + type="pkg" + downloadURL="http://dn.ringcentral.com/data/web/download/RCMeetings/1210/RCMeetingsClientSetup.pkg" + expectedTeamID="M932RC5J66" + blockingProcesses=( "RingCentral Meetings" ) + ;; +ringcentralapp) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Glip" + type="dmg" + downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac" + expectedTeamID="M932RC5J66" + blockingProcesses=( "Glip" ) + ;; +sfsymbols) + name="SF Symbols" + type="pkgInDmg" + downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg" + expectedTeamID="Software Update" + ;; +swiftruntimeforcommandlinetools) + # Note: this installer will error on macOS versions later than 10.14.3 + name="SwiftRuntimeForCommandLineTools" + type="pkgInDmg" + downloadURL="https://updates.cdn-apple.com/2019/cert/061-41823-20191025-5efc5a59-d7dc-46d3-9096-396bb8cb4a73/SwiftRuntimeForCommandLineTools.dmg" + expectedTeamID="Software Update" + ;; +aquaskk) + # credit: Tadayuki Onishi (@kenchan0130) + name="aquaskk" + type="pkg" + downloadURL="$(downloadURLFromGit codefirst aquaskk)" + expectedTeamID="FPZK4WRGW7" + ;; +krisp) + # credit: Tadayuki Onishi (@kenchan0130) + name="Krisp" + type="pkg" + downloadURL="https://download.krisp.ai/mac" + expectedTeamID="U5R26XM5Z2" + ;; +torbrowser) + # credit: Søren Theilgaard (@theilgaard) + name="Tor Browser" + type="dmg" + downloadURL=https://www.torproject.org$(curl -fs https://www.torproject.org/download/ | grep "downloadLink" | grep dmg | cut -d '"' -f 4) + appNewVersion=$(curl -fs https://www.torproject.org/download/ | grep "downloadLink" | grep dmg | cut -d '"' -f 4 | cut -d / -f 4) + expectedTeamID="MADPSAYN6T" + ;; +code42) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Code42" + type="pkgInDmg" + downloadURL=https://download.code42.com/installs/agent/latest-mac.dmg + expectedTeamID="9YV9435DHD" + blockingProcesses=( NONE ) + ;; +nomad) + # credit: Tadayuki Onishi (@kenchan0130) + name="NoMAD" + type="pkg" + downloadURL="https://files.nomad.menu/NoMAD.pkg" + expectedTeamID="AAPZK3CB24" + ;; +bettertouchtool) + # credit: Tadayuki Onishi (@kenchan0130) + name="BetterTouchTool" + type="zip" + downloadURL="https://folivora.ai/releases/BetterTouchTool.zip" + expectedTeamID="DAFVSXZ82P" + ;; +r) + # credit: Tadayuki Onishi (@kenchan0130) + name="R" + type="pkg" + downloadURL=$( curl -fsL https://formulae.brew.sh/api/cask/r.json | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p' ) + expectedTeamID="VZLD955F6P" + ;; +8x8) + # credit: #D-A-James from MacAdmins Slack and Isaac Ordonez, Mann consulting (@mannconsulting) + name="8x8 - Virtual Office" + type="dmg" + downloadURL=$(curl -fs https://support.8x8.com/cloud-phone-service/voice/virtual-office-desktop/download-virtual-office-desktop | grep -m 1 -o "http.*VOD.*.dmg") + expectedTeamID="FC967L3QRG" + ;; +egnyte) + # credit: #MoeMunyoki from MacAdmins Slack + name="Egnyte Connect" + type="pkg" + downloadURL="https://egnyte-cdn.egnyte.com/egnytedrive/mac/en-us/latest/EgnyteConnectMac.pkg" + expectedTeamID="FELUD555VC" + blockingProcesses=( NONE ) + ;; + +# MARK: add new labels above here + +# NOTE: Packages is signed but _not_ notarized, so spctl will reject it +# packages) +# name="Packages" +# type="pkgInDmg" +# pkgName="Install Packages.pkg" +# downloadURL="http://s.sudre.free.fr/Software/files/Packages.dmg" +# expectedTeamID="NL5M9E394P" +# ;; + +# msupdate codes from: +# https://docs.microsoft.com/en-us/deployoffice/mac/update-office-for-mac-using-msupdate + +# download link IDs from: https://macadmin.software + +microsoftoffice365) + name="MicrosoftOffice365" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=525133" + expectedTeamID="UBF8T346G9" + # using MS PowerPoint as the 'stand-in' for the entire suite + appName="Microsoft PowerPoint.app" + blockingProcesses=( "Microsoft AutoUpdate" "Microsoft Word" "Microsoft PowerPoint" "Microsoft Excel" "Microsoft OneNote" "Microsoft Outlook" "OneDrive" ) + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install ) + ;; +microsoftofficebusinesspro) + name="MicrosoftOfficeBusinessPro" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=2009112" + expectedTeamID="UBF8T346G9" + # using MS PowerPoint as the 'stand-in' for the entire suite + appName="Microsoft PowerPoint.app" + blockingProcesses=( "Microsoft AutoUpdate" "Microsoft Word" "Microsoft PowerPoint" "Microsoft Excel" "Microsoft OneNote" "Microsoft Outlook" "OneDrive" "Teams") + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install ) + ;; +microsoftedgeconsumerstable) + name="Microsoft Edge" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=2069148" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps EDGE01 ) + ;; +microsoftcompanyportal) + name="Company Portal" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=869655" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps IMCP01 ) + ;; +microsoftskypeforbusiness) + name="Skype for Business" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=832978" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps MSFB16 ) + ;; +microsoftremotedesktop) + name="Microsoft Remote Desktop" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=868963" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps MSRD10 ) + ;; +microsoftteams) + name="Microsoft Teams" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=869428" + expectedTeamID="UBF8T346G9" + blockingProcesses=( Teams "Microsoft Teams Helper" ) + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps TEAM01 ) + ;; +microsoftautoupdate) + name="Microsoft AutoUpdate" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=830196" + expectedTeamID="UBF8T346G9" + # commented the updatetool for MSAutoupdate, because when Autoupdate is really + # old or broken, you want to force a new install + #updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + #updateToolArguments=( --install --apps MSau04 ) + ;; +microsoftedgeenterprisestable) + name="Microsoft Edge" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=2093438" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps EDGE01 ) + ;; +microsoftword) + name="Microsoft Word" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=525134" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps MSWD2019 ) + ;; +microsoftexcel) + name="Microsoft Excel" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=525135" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps XCEL2019 ) + ;; +microsoftpowerpoint) + name="Microsoft PowerPoint" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=525136" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps PPT32019 ) + ;; +microsoftoutlook) + name="Microsoft Outlook" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=525137" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps OPIM2019 ) + ;; +microsoftonenote) + name="Microsoft OneNote" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=820886" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps ONMC2019 ) + ;; +microsoftonedrive) + name="OneDrive" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=823060" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps ONDR18 ) + ;; +microsoftsharepointplugin) + name="MicrosoftSharePointPlugin" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=800050" + expectedTeamID="UBF8T346G9" + # TODO: determine blockingProcesses for SharePointPlugin + ;; +visualstudiocode) + name="Visual Studio Code" + type="zip" + downloadURL="https://go.microsoft.com/fwlink/?LinkID=620882" + expectedTeamID="UBF8T346G9" + appName="Visual Studio Code.app" + blockingProcesses=( Electron ) + ;; +microsoftdefenderatp) + name="Microsoft Defender ATP" + type="pkg" + downloadURL="https://go.microsoft.com/fwlink/?linkid=2097502" + expectedTeamID="UBF8T346G9" + updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" + updateToolArguments=( --install --apps WDAV00 ) + ;; -# Note: Packages is signed but _not_ notarized, so spctl will reject it -# packages) -# name="Packages" -# type="pkgInDmg" -# pkgName="Install Packages.pkg" -# downloadURL="http://s.sudre.free.fr/Software/files/Packages.dmg" -# expectedTeamID="NL5M9E394P" -# ;; - - # msupdate codes from: - # https://docs.microsoft.com/en-us/deployoffice/mac/update-office-for-mac-using-msupdate - - # download link IDs from: https://macadmin.software - - microsoftoffice365) - name="MicrosoftOffice365" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=525133" - expectedTeamID="UBF8T346G9" - # using MS PowerPoint as the 'stand-in' for the entire suite - appName="Microsoft PowerPoint.app" - blockingProcesses=( "Microsoft AutoUpdate" "Microsoft Word" "Microsoft PowerPoint" "Microsoft Excel" "Microsoft OneNote" "Microsoft Outlook" "OneDrive" ) - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install ) - ;; - microsoftofficebusinesspro) - name="MicrosoftOfficeBusinessPro" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=2009112" - expectedTeamID="UBF8T346G9" - # using MS PowerPoint as the 'stand-in' for the entire suite - appName="Microsoft PowerPoint.app" - blockingProcesses=( "Microsoft AutoUpdate" "Microsoft Word" "Microsoft PowerPoint" "Microsoft Excel" "Microsoft OneNote" "Microsoft Outlook" "OneDrive" "Teams") - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install ) - ;; - microsoftedgeconsumerstable) - name="Microsoft Edge" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=2069148" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps EDGE01 ) - ;; - microsoftcompanyportal) - name="Company Portal" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=869655" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps IMCP01 ) - ;; - microsoftskypeforbusiness) - name="Skype for Business" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=832978" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps MSFB16 ) - ;; - microsoftremotedesktop) - name="Microsoft Remote Desktop" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=868963" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps MSRD10 ) - ;; - microsoftteams) - name="Microsoft Teams" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=869428" - expectedTeamID="UBF8T346G9" - blockingProcesses=( Teams "Microsoft Teams Helper" ) - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps TEAM01 ) - ;; - microsoftautoupdate) - name="Microsoft AutoUpdate" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=830196" - expectedTeamID="UBF8T346G9" - # commented the updatetool for MSAutoupdate, because when Autoupdate is really - # old or broken, you want to force a new install - #updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - #updateToolArguments=( --install --apps MSau04 ) - ;; - microsoftedgeenterprisestable) - name="Microsoft Edge" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=2093438" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps EDGE01 ) - ;; - microsoftword) - name="Microsoft Word" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=525134" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps MSWD2019 ) - ;; - microsoftexcel) - name="Microsoft Excel" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=525135" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps XCEL2019 ) - ;; - microsoftpowerpoint) - name="Microsoft PowerPoint" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=525136" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps PPT32019 ) - ;; - microsoftoutlook) - name="Microsoft Outlook" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=525137" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps OPIM2019 ) - ;; - microsoftonenote) - name="Microsoft OneNote" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=820886" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps ONMC2019 ) - ;; - microsoftonedrive) - name="OneDrive" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=823060" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps ONDR18 ) - ;; - microsoftsharepointplugin) - name="MicrosoftSharePointPlugin" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=800050" - expectedTeamID="UBF8T346G9" - # TODO: determine blockingProcesses for SharePointPlugin - ;; - visualstudiocode) - name="Visual Studio Code" - type="zip" - downloadURL="https://go.microsoft.com/fwlink/?LinkID=620882" - expectedTeamID="UBF8T346G9" - appName="Visual Studio Code.app" - blockingProcesses=( Electron ) - ;; - microsoftdefenderatp) - name="Microsoft Defender ATP" - type="pkg" - downloadURL="https://go.microsoft.com/fwlink/?linkid=2097502" - expectedTeamID="UBF8T346G9" - updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" - updateToolArguments=( --install --apps WDAV00 ) - ;; - - - # these descriptions exist for testing and are intentionally broken - brokendownloadurl) - name="Google Chrome" - type="dmg" - downloadURL="https://broken.com/broken.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; - brokenappname) - name="brokenapp" - type="dmg" - downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; - brokenteamid) - name="Google Chrome" - type="dmg" - downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" - expectedTeamID="broken" - ;; - *) - # unknown label - printlog "unknown label $label" - exit 1 - ;; +# these descriptions exist for testing and are intentionally broken +brokendownloadurl) + name="Google Chrome" + type="dmg" + downloadURL="https://broken.com/broken.dmg" + expectedTeamID="EQHXZ8M8AV" + ;; +brokenappname) + name="brokenapp" + type="dmg" + downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + expectedTeamID="EQHXZ8M8AV" + ;; +brokenteamid) + name="Google Chrome" + type="dmg" + downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + expectedTeamID="broken" + ;; +*) + # unknown label + printlog "unknown label $label" + exit 1 + ;; esac -# functions +# MARK: Functions + cleanupAndExit() { # $1 = exit code, $2 message if [[ -n $2 && $1 -ne 0 ]]; then printlog "ERROR: $2" @@ -904,9 +1003,10 @@ runAsUser() { fi } -displaydialog() { # $1: message +displaydialog() { # $1: message $2: title message=${1:-"Message"} - runAsUser /usr/bin/osascript -e "button returned of (display dialog \"$message\" buttons {\"Not Now\", \"Quit and Update\"} default button \"Quit and Update\")" + title=${2:-"Installomator"} + runAsUser osascript -e "button returned of (display dialog \"$message\" with title \"$title\" buttons {\"Not Now\", \"Quit and Update\"} default button \"Quit and Update\")" } displaynotification() { # $1: message $2: title @@ -924,7 +1024,14 @@ displaynotification() { # $1: message $2: title getAppVersion() { # get all apps matching name - applist=$(mdfind "kMDItemFSName == '$appName' && kMDItemKind == 'Application'" -0 ) + applist=$(mdfind "kind:application $appName" -0 ) + if [[ $applist = "" ]]; then + printlog "Spotlight not returning any app, trying manually in /Applications." + if [[ -d "/Applications/$appName" ]]; then + applist="/Applications/$appName" + fi + fi + appPathArray=( ${(0)applist} ) if [[ ${#appPathArray} -gt 0 ]]; then @@ -953,7 +1060,7 @@ checkRunningProcesses() { countedProcesses=0 for x in ${blockingProcesses}; do if pgrep -xq "$x"; then - echo "found blocking process $x" + printlog "found blocking process $x" case $BLOCKING_PROCESS_ACTION in kill) @@ -961,7 +1068,7 @@ checkRunningProcesses() { pkill $x ;; prompt_user) - button=$(displaydialog "The application $x needs to be updated. Quit $x to continue updating?") + button=$(displaydialog "Quit “$x” to continue updating? (Leave this dialogue if you want to activate this update later)." "The application “$x” needs to be updated.") if [[ $button = "Not Now" ]]; then cleanupAndExit 10 "user aborted update" else @@ -1021,7 +1128,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir cleanupAndExit 6 "not running as root, exiting" fi - echo "DEBUG enabled, skipping copy and chown steps" + printlog "DEBUG enabled, skipping copy and chown steps" return 0 fi @@ -1040,7 +1147,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir # set ownership to current user if [ "$currentUser" != "loginwindow" ]; then - echo "Changing owner to $currentUser" + printlog "Changing owner to $currentUser" chown -R "$currentUser" "$targetDir/$appName" else printlog "No user logged in, not changing user" @@ -1061,7 +1168,7 @@ mountDMG() { cleanupAndExit 3 fi - echo "Mounted: $dmgmount" + printlog "Mounted: $dmgmount" } installFromDMG() { @@ -1080,7 +1187,7 @@ installFromPKG() { fi teamID=$(echo $spctlout | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' ) - echo $teamID + # Apple signed software has no teamID, grab entire origin instead if [[ -z $teamID ]]; then teamID=$(echo $spctlout | awk -F '=' '/origin=/ {print $NF }') @@ -1103,7 +1210,7 @@ installFromPKG() { # check for root if [ "$(whoami)" != "root" ]; then # not running as root - echo "not running as root, exiting" + printlog "not running as root, exiting" cleanupAndExit 6 fi @@ -1118,8 +1225,20 @@ installFromPKG() { installFromZIP() { # unzip the archive printlog "Unzipping $archiveName" - tar -xf "$archiveName" + + # tar -xf "$archiveName" + # note: when you expand a zip using tar in Mojave the expanded + # app will never pass the spctl check + + unzip -o -qq "$archiveName" + installAppWithPath "$tmpDir/$appName" +} + +installFromTBZ() { + # unzip the archive + printlog "Unzipping $archiveName" + tar -xf "$archiveName" installAppWithPath "$tmpDir/$appName" } @@ -1189,11 +1308,11 @@ runUpdateTool() { -### main code starts here +# MARK: main code starts here -# extract info from data +# MARK: extract info from data if [ -z "$archiveName" ]; then case $type in dmg|pkg|zip|tbz) @@ -1237,7 +1356,7 @@ if [[ -z $blockingProcesses ]]; then blockingProcesses=( $name ) fi -# determine tmp dir +# MARK: determine tmp dir if [ "$DEBUG" -ne 0 ]; then # for debugging use script dir as working directory tmpDir=$(dirname "$0") @@ -1246,7 +1365,7 @@ else tmpDir=$(mktemp -d ) fi -# change directory to temporary working directory +# MARK: change directory to temporary working directory printlog "Changing directory to $tmpDir" if ! cd "$tmpDir"; then printlog "error changing directory $tmpDir" @@ -1254,7 +1373,7 @@ if ! cd "$tmpDir"; then cleanupAndExit 1 fi -# check if this is an Update +# MARK: check if this is an Update getAppVersion if [[ -n $appVersion ]]; then if [[ $DEBUG -eq 0 ]]; then @@ -1266,7 +1385,7 @@ if [[ -n $appVersion ]]; then fi fi -# when user is logged in, and app is running, prompt user to quit app +# MARK: when user is logged in, and app is running, prompt user to quit app if [[ $BLOCKING_PROCESS_ACTION == "ignore" ]]; then printlog "ignoring blocking processes" @@ -1280,7 +1399,7 @@ else fi fi -# download the archive +# MARK: download the archive if [ -f "$archiveName" ] && [ "$DEBUG" -ne 0 ]; then printlog "$archiveName exists and DEBUG enabled, skipping download" @@ -1293,6 +1412,8 @@ else fi fi +# MARK: install the download + case $type in dmg) installFromDMG @@ -1300,9 +1421,12 @@ case $type in pkg) installFromPKG ;; - zip|tbz) + zip) installFromZIP ;; + tbz) + installFromTBZ + ;; pkgInDmg) installPkgInDmg ;; @@ -1315,7 +1439,7 @@ case $type in ;; esac -# print installed application location and version +# MARK: print installed application location and version sleep 10 # wait a moment to let spotlight catch up getAppVersion @@ -1329,7 +1453,7 @@ printlog "$message" if [[ $currentUser != "loginwindow" && $NOTIFY == "success" ]]; then printlog "notifying" - displaynotification "$message" "Installation complete!" + displaynotification "$message" "$name update/installation complete!" fi # all done! diff --git a/Labels.txt b/Labels.txt index d53a971..0ac878f 100644 --- a/Labels.txt +++ b/Labels.txt @@ -1,12 +1,18 @@ 1password7 +8x8 adobereaderdc +adobereaderdc-install +adobereaderdc-update appcleaner +aquaskk atom autodmg aviatrix bbedit +bettertouchtool boxdrive brave +code42 coderunner cyberduck depnotify @@ -14,6 +20,7 @@ desktoppr discord docker dropbox +egnyte eraseinstall firefox firefoxesrpkg @@ -31,6 +38,7 @@ jamfmigrator jamfpppcutility jamfreenroller karabinerelements +krisp malwarebytes microsoftautoupdate microsoftcompanyportal @@ -50,15 +58,15 @@ microsoftskypeforbusiness microsoftteams microsoftword netnewswire +nomad omnifocus3 omnigraffle7 openvpnconnect pacifist plisteditpro postman -powershell -powershell-lts privileges +r resiliosynchome ringcentralapp ringcentralmeetings @@ -68,6 +76,8 @@ sfsymbols signal slack sonos +sonoss1 +sonoss2 sourcetree spotify sublimetext @@ -76,6 +86,7 @@ swiftruntimeforcommandlinetools teamviewer textmate things +torbrowser tunnelbear umbrellaroamingclient visualstudiocode diff --git a/README.md b/README.md index d9d8693..5cc5a36 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,20 @@ Your production and deployment environment will be different, please test thorou I have put a lot of work into making it stable and safe, but I cannot - of course - make _any_ promises that it won't break in some not yet encountered edge case. +## Support and Contributing + +Discussion, support and advice around Installomator happens in the `#installomator` channel in the [MacAdmins Slack](https:/macadmins.org). Go there for support questions. + +Do not create an issue just when you have a questions, but do file an issue or pull request for bugs or wrong behavior. When in doubt, ask in the above Slack channel. + +If you have added a new label, then please file a pull request. (and Thank you!) + +## More reading + +There are a few interesting post on Installomator on my weblog: + +- [Introducing Installomator](https://scriptingosx.com/2020/05/introducing-installomator/) +- [Using Installomator with Jamf Pro](https://scriptingosx.com/2020/06/using-installomator-with-jamf-pro/) by Mischa van der Bent ## Background @@ -97,12 +111,12 @@ There is a debug mode and one other setting that can be controlled with variable As of this writing, Installomator knows how to download and install more than 50 different applications. You can add more by adding a block to the _long_ `case` statement starting on line 160. Some of them are more elaborate, but most of them just need this information: ``` - googlechrome) - name="Google Chrome" - type="dmg" - downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; +googlechrome) + name="Google Chrome" + type="dmg" + downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + expectedTeamID="EQHXZ8M8AV" + ;; ``` When you know how to extract these pieces of information from the application and/or download, then you can add an application to Installomator. @@ -211,12 +225,12 @@ The `NOTIFY` variable controls the notifications shown to the user. As of now, t The script requires four pieces of information to download and install an application: ``` - spotify) - name="Spotify" - type="dmg" - downloadURL="https://download.scdn.co/Spotify.dmg" - expectedTeamID="2FNC3A47ZF" - ;; +spotify) + name="Spotify" + type="dmg" + downloadURL="https://download.scdn.co/Spotify.dmg" + expectedTeamID="2FNC3A47ZF" + ;; ``` The four required variables are @@ -244,7 +258,7 @@ The 10-character Developer Team ID with which the application or pkg is signed a - Applications (in dmgs or zips) `spctl -a -vv /Applications/BBEdit.app` - - Pkgs + - Installation Packages (pkg) `spctl -a -vv -t install ~/Downloads/desktoppr-0.2.pkg` @@ -337,5 +351,5 @@ But it is not suited as a client install automation tool. ### Why don't you just use brew? -Read the explanation for `autopkg`, pretty much the same applies for `brew`, i.e. While it is useful on a single Mac, it is a un-manageable mess when you think about deploying and managing on a fleet of computers. +Read the explanation for `autopkg`, pretty much the same applies for `brew`, i.e. while it is useful on a single Mac, it is a un-manageable mess when you think about deploying and managing on a fleet of computers.