From 8fc1640e5cd99fda70d98158ea17ac0efa383a7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Mon, 15 Feb 2021 12:56:37 +0100 Subject: [PATCH 01/17] With Theile additions (0.4.19) --- Installomator.sh | 1391 +++++++++++++++++++++++++++++++--------------- 1 file changed, 932 insertions(+), 459 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index 46537a3..8647ea6 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -8,8 +8,8 @@ # inspired by the download scripts from William Smith and Sander Schram # with additional ideas and contribution from Isaac Ordonez, Mann consulting -VERSION='0.5' -VERSIONDATE='20201019' +VERSION='0.4.19' +VERSIONDATE='2021-02-15' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -26,6 +26,7 @@ NOTIFY=success # options: # - success notify the user on success # - silent no notifications +# - all all notifications (great for Self Service installation) # behavior when blocking processes are found @@ -35,12 +36,31 @@ BLOCKING_PROCESS_ACTION=prompt_user # - silent_fail exit script without prompt or installation # - prompt_user show a user dialog for each blocking process found # abort after three attempts to quit +# (only if user accepts to quit the apps, otherwise +# the update is cancelled). # - prompt_user_then_kill # show a user dialog for each blocking process found, # attempt to quit two times, kill the process finally +# - prompt_user_loop +# Like prompt-user, but clicking "Not Now", will just wait an hour, +# and then it will ask again. +# - tell_user User will be showed a notification about the important update, +# but user is only allowed to quit and continue, and then we +# ask the app to quit. +# - tell_user_then_kill +# Show dialog 2 times, and if the quitting fails, the +# blocking processes will be killed. # - kill kill process without prompting or giving the user a chance to save +# install behavior +INSTALL="" +# options: +# - When not set, software will only be installed +# if it is newer/different in version +# - force Install even if it’s the same version + + # NOTE: How labels work # Each workflow label needs to be listed in the case statement below. @@ -57,11 +77,23 @@ BLOCKING_PROCESS_ACTION=prompt_user # - zip # - pkgInDmg # - pkgInZip (not yet tested) +# - appInDmgInZip +# +# - packageID: (optional) +# The package ID of a pkg +# If given, will be used to find version of installed software, instead of searching for an app. +# Usefull if a pkg does not install an app. +# See label installomator_st # # - downloadURL: (required) # URL to download the dmg. # Can be generated with a series of commands (see BBEdit for an example). # +# - appNewVersion: (optional) +# Version of the downloaded software. +# If given, it will be compared to installed version, to see if download is different. +# It does not check for newer or not, only different. +# # - expectedTeamID: (required) # 10-digit developer team ID. # Obtain the team ID by running: @@ -98,8 +130,8 @@ BLOCKING_PROCESS_ACTION=prompt_user # When a workflow has no blocking processes, use # blockingProcesses=( NONE ) # -# - pkgName: (optional, only used for dmgInPkg and dmgInZip) -# File name of the pkg file _inside_ the dmg or zip +# - pkgName: (optional, only used for pkgInDmg, dmgInZip, and appInDmgInZip) +# File name of the pkg/dmg file _inside_ the dmg or zip # When not given the pkgName is derived from the $name # # - updateTool: @@ -133,7 +165,9 @@ cleanupAndExit() { # $1 = exit code, $2 message printlog "Unmounting $dmgmount" hdiutil detach "$dmgmount" fi - printlog "################## End Installomator \n\n" + # If we closed any processes, reopen the app again + reopenClosedProcess + printlog "################## End Installomator, exit code $1 \n\n" exit "$1" } @@ -147,7 +181,13 @@ runAsUser() { displaydialog() { # $1: message $2: title message=${1:-"Message"} 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\")" + runAsUser osascript -e "button returned of (display dialog \"$message\" with title \"$title\" buttons {\"Not Now\", \"Quit and Update\"} default button \"Quit and Update\" with icon caution)" +} + +displaydialogContinue() { # $1: message $2: title + message=${1:-"Message"} + title=${2:-"Installomator"} + runAsUser osascript -e "button returned of (display dialog \"$message\" with title \"$title\" buttons {\"Quit and Update\"} default button \"Quit and Update\" with icon stop)" } displaynotification() { # $1: message $2: title @@ -171,9 +211,9 @@ printlog(){ timestamp=$(date +%F\ %T) if [[ "$(whoami)" == "root" ]]; then - echo "$timestamp" "$1" | tee -a $log_location - else - echo "$timestamp" "$1" + echo "$timestamp" "$label" "$1" | tee -a $log_location + else + echo "$timestamp" "$label" "$1" fi } @@ -192,10 +232,10 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name if [ -n "$archiveName" ]; then downloadURL=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ - | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }") + | awk -F '"' "/browser_download_url/ && /$archiveName/ { print \$4 }") else downloadURL=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ - | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }") + | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4 }") fi if [ -z "$downloadURL" ]; then printlog "could not retrieve download URL for $gitusername/$gitreponame" @@ -206,23 +246,52 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name fi } - -xpath() { - # the xpath tool changes in Big Sur and now requires the `-e` option - if [[ $(sw_vers -buildVersion) > "20A" ]]; then - /usr/bin/xpath -e $@ - # alternative: switch to xmllint (which is not perl) - #xmllint --xpath $@ - +versionFromGit() { + # credit: Søren Theilgaard (@theilgaard) + # $1 git user name, $2 git repo name + gitusername=${1?:"no git user name"} + gitreponame=${2?:"no git repo name"} + + appNewVersion=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g') + if [ -z "$appNewVersion" ]; then + printlog "could not retrieve version number for $gitusername/$gitreponame" + appNewVersion="" else - /usr/bin/xpath $@ + echo "$appNewVersion" + return 0 fi } +# Handling of differences in xpath between Catalina and Big Sur +xpath() { + # the xpath tool changes in Big Sur and now requires the `-e` option + if [[ $(sw_vers -buildVersion) > "20A" ]]; then + /usr/bin/xpath -e $@ + # alternative: switch to xmllint (which is not perl) + #xmllint --xpath $@ - + else + /usr/bin/xpath $@ + fi +} + + getAppVersion() { + # modified by: Søren Theilgaard (@theilgaard) + # pkgs contains a version number, then we don't have to search for an app + if [[ $packageID != "" ]]; then + appversion="$(pkgutil --pkg-info-plist ${packageID} 2>/dev/null | grep -A 1 pkg-version | tail -1 | sed -E 's/.*>([0-9.]*)<.*/\1/g')" + if [[ $appversion != "" ]]; then + printlog "found packageID $packageID installed, version $appversion" + return + else + printlog "No version found using packageID $packageID" + fi + fi + # get all apps matching name applist=$(mdfind "kind:application $appName" -0 ) - if [[ $applist = "" ]]; then + if [[ $applist = "" ]]; then printlog "Spotlight not returning any app, trying manually in /Applications." if [[ -d "/Applications/$appName" ]]; then applist="/Applications/$appName" @@ -235,7 +304,7 @@ getAppVersion() { filteredAppPaths=( ${(M)appPathArray:#${targetDir}*} ) if [[ ${#filteredAppPaths} -eq 1 ]]; then installedAppPath=$filteredAppPaths[1] - appversion=$(mdls -name kMDItemVersion -raw $installedAppPath ) + appversion=$(defaults read $installedAppPath/Contents/Info.plist CFBundleShortVersionString) #Not dependant on Spotlight indexing, Armin: appversion=$(mdls -name kMDItemVersion -raw $installedAppPath ) printlog "found app at $installedAppPath, version $appversion" else printlog "could not determine location of $appName" @@ -253,31 +322,66 @@ checkRunningProcesses() { fi # try at most 3 times - for i in {1..3}; do + for i in {1..4}; do countedProcesses=0 for x in ${blockingProcesses}; do if pgrep -xq "$x"; then printlog "found blocking process $x" - + appClosed=1 + case $BLOCKING_PROCESS_ACTION in kill) printlog "killing process $x" pkill $x + sleep 5 ;; prompt_user|prompt_user_then_kill) 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 - if [[ $i = 3 && $BLOCKING_PROCESS_ACTION = "prompt_user_then_kill" ]]; then - printlog "killing process $x" - pkill $x + if [[ $i > 2 && $BLOCKING_PROCESS_ACTION = "prompt_user_then_kill" ]]; then + printlog "Changing BLOCKING_PROCESS_ACTION to kill" + BLOCKING_PROCESS_ACTION=kill else printlog "telling app $x to quit" runAsUser osascript -e "tell app \"$x\" to quit" + # give the user a bit of time to quit apps + printlog "waiting 30 seconds for processes to quit" + sleep 30 fi fi ;; + prompt_user_loop) + button=$(displaydialog "Quit “$x” to continue updating? (Click “Not Now” to be asked in 1 hour, or leave this open until you are ready)." "The application “$x” needs to be updated.") + if [[ $button = "Not Now" ]]; then + if [[ $i < 2 ]]; then + printlog "user wants to wait an hour" + sleep 3600 # 3600 seconds is an hour + else + printlog "change of BLOCKING_PROCESS_ACTION to tell_user" + BLOCKING_PROCESS_ACTION=tell_user + fi + else + printlog "telling app $x to quit" + runAsUser osascript -e "tell app \"$x\" to quit" + # give the user a bit of time to quit apps + printlog "waiting 30 seconds for processes to quit" + sleep 30 + fi + ;; + tell_user|tell_user_then_kill) + button=$(displaydialogContinue "Quit “$x” to continue updating? (This is an important update). Wait for notification of update before launching app again." "The application “$x” needs to be updated.") + printlog "telling app $x to quit" + runAsUser osascript -e "tell app \"$x\" to quit" + # give the user a bit of time to quit apps + printlog "waiting 30 seconds for processes to quit" + sleep 30 + if [[ $i > 1 && $BLOCKING_PROCESS_ACTION = tell_user_then_kill ]]; then + printlog "Changing BLOCKING_PROCESS_ACTION to kill" + BLOCKING_PROCESS_ACTION=kill + fi + ;; silent_fail) cleanupAndExit 12 "blocking process '$x' found, aborting" ;; @@ -287,14 +391,6 @@ checkRunningProcesses() { fi done - if [[ $countedProcesses -eq 0 ]]; then - # no blocking processes, exit the loop early - break - else - # give the user a bit of time to quit apps - printlog "waiting 30 seconds for processes to quit" - sleep 30 - fi done if [[ $countedProcesses -ne 0 ]]; then @@ -304,7 +400,24 @@ checkRunningProcesses() { printlog "no more blocking processes, continue with update" } +reopenClosedProcess() { + # If Installomator closed any processes, let's get the app opened again + # credit: Søren Theilgaard (@theilgaard) + + # don't reopen in DEBUG mode + if [[ $DEBUG -ne 0 ]]; then + printlog "DEBUG mode, not reopening anything" + return + fi + + if [[ $appClosed == 1 ]]; then + printlog "Telling app $name to open" + runAsUser osascript -e "tell app \"$name\" to open" + fi +} + installAppWithPath() { # $1: path to app to install in $targetDir + # modified by: Søren Theilgaard (@theilgaard) appPath=${1?:"no path to app"} # check if app exists @@ -318,12 +431,31 @@ installAppWithPath() { # $1: path to app to install in $targetDir cleanupAndExit 4 "Error verifying $appPath" fi - printlog "Team ID: $teamID (expected: $expectedTeamID )" + printlog "Team ID matching: $teamID (expected: $expectedTeamID )" if [ "$expectedTeamID" != "$teamID" ]; then cleanupAndExit 5 "Team IDs do not match" fi + # versioncheck + # credit: Søren Theilgaard (@theilgaard) + appNewVersion=$(defaults read $appPath/Contents/Info.plist CFBundleShortVersionString) + if [[ $appversion == $appNewVersion ]]; then + printlog "Downloaded version of $name is $appNewVersion, same as installed." + if [[ $INSTALL != "force" ]]; then + message="$name, version $appNewVersion, is the latest version." + if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then + printlog "notifying" + displaynotification "$message" "No update for $name!" + fi + cleanupAndExit 0 "No new version to install" + else + printlog "Using force to install anyway." + fi + else + printlog "Downloaded version of $name is $appNewVersion (replacing version $appversion)." + fi + # check for root if [ "$(whoami)" != "root" ]; then # not running as root @@ -376,28 +508,15 @@ mountDMG() { installFromDMG() { mountDMG - - applicationPath="$dmgmount/$appName" - printlog "looking for app: $applicationPath" - if [[ ! -d $applicationPath ]]; then - # find first file ending with 'app' - findfiles=$(find "$dmgmount" -iname "*.app" -maxdepth 1 -mindepth 1 ) - filearray=( ${(f)findfiles} ) - if [[ ${#filearray} -eq 0 ]]; then - cleanupAndExit 21 "couldn't find app in dmg $archiveName" - fi - applicationPath="${filearray[1]}" - printlog "found app: $applicationPath" - fi - - installAppWithPath "$applicationPath" + + installAppWithPath "$dmgmount/$appName" } installFromPKG() { # verify with spctl printlog "Verifying: $archiveName" - if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then + if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then printlog "Error verifying $archiveName" cleanupAndExit 4 fi @@ -444,9 +563,9 @@ installFromZIP() { # tar -xf "$archiveName" - # note: when you expand a zip using tar in Mojave the expanded + # note: when you expand a zip using tar in Mojave the expanded # app will never pass the spctl check - + # unzip -o -qq "$archiveName" # note: githubdesktop fails spctl verification when expanded @@ -468,7 +587,7 @@ installPkgInDmg() { # locate pkg in dmg if [[ -z $pkgName ]]; then # find first file ending with 'pkg' - findfiles=$(find "$dmgmount" -iname "*.pkg" -maxdepth 1 -mindepth 1 ) + findfiles=$(find "$dmgmount" -iname "*.pkg" -maxdepth 1 ) filearray=( ${(f)findfiles} ) if [[ ${#filearray} -eq 0 ]]; then cleanupAndExit 20 "couldn't find pkg in dmg $archiveName" @@ -491,8 +610,8 @@ installPkgInZip() { # locate pkg in zip if [[ -z $pkgName ]]; then - # find first file starting with $name and ending with 'pkg' - findfiles=$(find "$tmpDir" -iname "*.pkg" -maxdepth 1 ) + # find first file ending with 'pkg' + findfiles=$(find "$tmpDir" -iname "*.pkg" -maxdepth 2 ) filearray=( ${(f)findfiles} ) if [[ ${#filearray} -eq 0 ]]; then cleanupAndExit 20 "couldn't find pkg in zip $archiveName" @@ -509,6 +628,31 @@ installPkgInZip() { installFromPKG } +installAppInDmgInZip() { + # unzip the archive + printlog "Unzipping $archiveName" + tar -xf "$archiveName" + + # locate dmg in zip + if [[ -z $pkgName ]]; then + # find first file ending with 'dmg' + findfiles=$(find "$tmpDir" -iname "*.dmg" -maxdepth 2 ) + filearray=( ${(f)findfiles} ) + if [[ ${#filearray} -eq 0 ]]; then + cleanupAndExit 20 "couldn't find dmg in zip $archiveName" + fi + archiveName="$(basename ${filearray[1]})" + # it is now safe to overwrite archiveName for installFromDMG + printlog "found dmg: $tmpDir/$archiveName" + else + # it is now safe to overwrite archiveName for installFromDMG + archiveName="$pkgName" + fi + + # installFromDMG, DMG expected to include an app (will not work with pkg) + installFromDMG +} + runUpdateTool() { if [[ -x $updateTool ]]; then printlog "running $updateTool $updateToolArguments" @@ -538,7 +682,9 @@ fi # MARK: argument parsing if [[ $# -eq 0 ]]; then + printlog "no label provided, printing labels" grep -E '^[a-z0-9\-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort + #grep -E '^[a-z0-9\-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort exit 0 elif [[ $1 == "/" ]]; then # jamf uses sends '/' as the first argument @@ -559,12 +705,12 @@ while [[ -n $1 ]]; do shift 1 done -printlog "################## Start Installomator" -printlog "################## $label" - # lowercase the label label=${label:l} +printlog "################## Start Installomator v. $VERSION" +printlog "################## $label" + # get current user currentUser=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }') @@ -588,12 +734,21 @@ autodmg) name="AutoDMG" type="dmg" downloadURL=$(downloadURLFromGit MagerValp AutoDMG) + appNewVersion=$(versionFromGit MagerValp AutoDMG) expectedTeamID="5KQ3D3FG5H" ;; googlechrome) name="Google Chrome" type="dmg" - downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + if [[ $(arch) != "i386" ]]; then + printlog "Architecture: arm64 (not i386)" + downloadURL="https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg" + appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}') # Credit: William Smith (@meck) + else + printlog "Architecture: i386" + downloadURL="https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg" + appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac,stable/{print $3; exit}') # Credit: William Smith (@meck) + fi expectedTeamID="EQHXZ8M8AV" ;; googlechromepkg) @@ -621,25 +776,38 @@ santa) # credit: Tadayuki Onishi (@kenchan0130) name="Santa" type="pkgInDmg" + packageID="com.google.santa" downloadURL=$(downloadURLFromGit google santa) + appNewVersion=$(versionFromGit google santa) expectedTeamID="EQHXZ8M8AV" ;; spotify) name="Spotify" type="dmg" downloadURL="https://download.scdn.co/Spotify.dmg" + # appNewVersion=$(curl -fs https://www.spotify.com/us/opensource/ | cat | grep -o ".*." | head -1 | cut -d ">" -f2 | cut -d "<" -f1) # does not result in the same version as downloaded 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) + appNewVersion=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort | tail -n1 | sed -E 's/.*BBEdit_([0-9 .]*)\.dmg.*/\1/') expectedTeamID="W52GZAXT98" ;; firefox) name="Firefox" type="dmg" downloadURL="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" + appNewVersion=$(/usr/bin/curl https://www.mozilla.org/en-US/firefox/releases/ --silent | /usr/bin/grep '([0-9\.]*) \(.*/\1/g') expectedTeamID="936EB786NH" ;; atom) @@ -688,6 +860,7 @@ atom) type="zip" archiveName="atom-mac.zip" downloadURL=$(downloadURLFromGit atom atom ) + appNewVersion=$(versionFromGit atom atom) expectedTeamID="VEKTX9H2N7" ;; eraseinstall) @@ -696,31 +869,73 @@ eraseinstall) downloadURL=https://bitbucket.org$(curl -fs https://bitbucket.org/prowarehouse-nl/erase-install/downloads/ | grep pkg | cut -d'"' -f2 | head -n 1) expectedTeamID="R55HK5K86Y" ;; +omnigraffle6) + name="OmniGraffle" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniGraffle6" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; 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) + 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) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) 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) + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniFocus3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; +omnioutliner5) + name="OmniOutliner" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniOutliner5" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; +omniplan3) + name="OmniPlan" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniPlan3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; +omnipresence) + name="OmniPresence" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniPresence" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; +omnidisksweeper) + name="OmniDiskSweeper" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniDiskSweeper" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) 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 ) + if [[ $(arch) == "arm64" ]]; then + downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) + appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 ) + elif [[ $(arch) == "i386" ]]; then + 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 ) + appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 ) + fi expectedTeamID="75GAHG3SZQ" ;; textmate) name="TextMate" type="tbz" - downloadURL="https://api.textmate.org/downloads/release?os=10.12" + #downloadURL="https://api.textmate.org/downloads/release?os=10.12" + downloadURL=$(downloadURLFromGit "textmate" "textmate") + appNewVersion=$(versionFromGit "textmate" "textmate") expectedTeamID="45TL96F76G" ;; depnotify) @@ -742,6 +957,7 @@ sourcetree) 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 ) + appNewVersion=$(curl -fs https://product-downloads.atlassian.com/software/sourcetree/Appcast/SparkleAppcastAlpha.xml | xpath '//rss/channel/item[last()]/title' 2>/dev/null | sed -n -e 's/^.*Version //p' | sed 's/\<\/title\>//' | sed $'s/[^[:print:]\t]//g') expectedTeamID="UPXU4CQZ5P" ;; boxdrive) @@ -763,6 +979,7 @@ zoom) name="Zoom.us" type="pkg" downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg" + appNewVersion=$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" "https://zoom.us/download" | grep Version | head -n 1 | sed -E 's/.* ([0-9.]* \(.*\)).*/\1/') # credit: Søren Theilgaard (@theilgaard) expectedTeamID="BJ4HAAB9B3" blockingProcesses=( zoom.us ) ;; @@ -796,7 +1013,7 @@ openvpnconnect) expectedTeamID="ACV7L3WCD8" ;; openvpnconnectv3) - # credit: @lotnix + # credit: @lotnix name="OpenVPN Connect" type="pkgInDmg" downloadURL="https://openvpn.net/downloads/openvpn-connect-v3-macos.dmg" @@ -812,6 +1029,7 @@ pacifist) name="1Password 7" type="pkg" downloadURL="https://app-updates.agilebits.com/download/OPM7" + appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[0-9a-zA-Z]*-([0-9.]*)\..*/\1/g' ) expectedTeamID="2BUA8C4S2C" ;; webexmeetings) @@ -820,11 +1038,12 @@ webexmeetings) type="pkgInDmg" downloadURL="https://akamaicdn.webex.com/client/webexapp.dmg" expectedTeamID="DE8Y96K9QP" + targetDir="/Applications" + blockingProcesses=( Webex ) ;; -webex|\ webexteams) # credit: Erik Stam (@erikstam) - name="Webex" + name="Webex Teams" type="dmg" downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg" expectedTeamID="DE8Y96K9QP" @@ -833,7 +1052,8 @@ citrixworkspace) #credit: Erik Stam (@erikstam) and #Philipp on MacAdmins Slack name="Citrix Workspace" type="pkgInDmg" - downloadURL="https:"$(curl -s -L "https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html#ctx-dl-eula-external" | grep "dmg?" | sed "s/.*rel=.\(.*\)..id=.*/\1/") + downloadURL="https:"$(curl -s -L "https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html#ctx-dl-eula-external" | grep "dmg?" | sed "s/.*rel=.\(.*\)..id=.*/\1/") # http://downloads.citrix.com/18823/CitrixWorkspaceApp.dmg?__gda__=1605791892_edc6786a90eb5197fb226861a8e27aa8 + appNewVersion=$(curl -fs https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html | grep "

Version" | head -1 | cut -d " " -f1 | cut -d ";" -f2 | cut -d "." -f 1-3) expectedTeamID="S272Y5R93J" ;; privileges) @@ -841,6 +1061,7 @@ privileges) name="Privileges" type="zip" downloadURL=$(downloadURLFromGit sap macOS-enterprise-privileges ) + appNewVersion=$(versionFromGit sap macOS-enterprise-privileges ) expectedTeamID="7R5ZEU67FQ" ;; icons) @@ -848,14 +1069,16 @@ icons) name="Icons" type="zip" downloadURL=$(downloadURLFromGit sap macOS-icon-generator ) + appNewVersion=$(versionFromGit sap macOS-icon-generator ) expectedTeamID="7R5ZEU67FQ" ;; -googledrivefilestream) +googledrive|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" + packageID="com.google.drivefs" + downloadURL="https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg" # downloadURL="https://dl.google.com/drive-file-stream/GoogleDrive.dmg" + blockingProcesses=( "Google Docs" "Google Drive" "Google Sheets" "Google Slides" ) expectedTeamID="EQHXZ8M8AV" ;; plisteditpro) @@ -867,7 +1090,12 @@ plisteditpro) slack) name="Slack" type="dmg" - downloadURL="https://slack.com/ssb/download-osx" + if [[ $(arch) == "arm64" ]]; then + downloadURL="https://slack.com/ssb/download-osx-silicon" + elif [[ $(arch) == "i386" ]]; then + downloadURL="https://slack.com/ssb/download-osx" + fi + appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*macos\/([0-9.]*)\/.*/\1/g' ) expectedTeamID="BQR82RBBHL" ;; sublimetext) @@ -875,12 +1103,15 @@ sublimetext) name="Sublime Text" type="dmg" downloadURL="https://download.sublimetext.com/latest/stable/osx" + appNewVersion=$(curl -fs https://www.sublimetext.com/3 | grep 'class="latest"' | cut -d '>' -f 4 | sed -E 's/ (.*[0-9]*)<.*/\1/g') + #appNewVersion=$(curl -Is https://download.sublimetext.com/latest/stable/osx | grep "Location:" | sed -n -e 's/^.*Sublime Text //p' | sed 's/.dmg//g' | sed $'s/[^[:print:]\t]//g') # Alternative from @Oh4sh0 expectedTeamID="Z6D26JE4Y4" ;; githubdesktop) name="GitHub Desktop" type="zip" downloadURL="https://central.github.com/deployments/desktop/desktop/latest/darwin" + appNewVersion=$(curl -fsL https://central.github.com/deployments/desktop/desktop/changelog.json | awk -F '{' '/"version"/ { print $2 }' | sed -E 's/.*,\"version\":\"([0-9.]*)\".*/\1/g') expectedTeamID="VEKTX9H2N7" ;; things) @@ -906,6 +1137,7 @@ 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 }") + appNewVersion=$(curl -sf "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" | awk -F '"' "/tag_name/ { print \$4 }") expectedTeamID="5X9DE89KYV" ;; netnewswire) @@ -913,6 +1145,7 @@ 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) + appNewVersion=$(curl -fs https://ranchero.com/downloads/netnewswire-release.xml | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) expectedTeamID="M8L2WTLA8W" ;; resiliosynchome) @@ -925,6 +1158,7 @@ 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 ) + appNewVersion=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2 ) expectedTeamID="G69SCX94XU" ;; dropbox) @@ -940,16 +1174,11 @@ teamviewer) downloadURL="https://download.teamviewer.com/download/TeamViewer.dmg" expectedTeamID="H7UGFBUGV6" ;; -teamviewerqs) - name="TeamViewerQS" - type="dmg" - downloadURL="https://download.teamviewer.com/download/TeamViewerQS.dmg" - expectedTeamID="H7UGFBUGV6" - ;; iterm2) name="iTerm" type="zip" downloadURL="https://iterm2.com/downloads/stable/latest" + appNewVersion=$(curl -is https://iterm2.com/downloads/stable/latest | grep location: | grep -o "iTerm2.*zip" | cut -d "-" -f 2 | cut -d '.' -f1 | sed 's/_/./g') expectedTeamID="H7V7XYVQ7D" blockingProcesses=( iTerm2 ) ;; @@ -957,6 +1186,7 @@ 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) + appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) expectedTeamID="VXP8K9EDP6" ;; appcleaner) @@ -971,6 +1201,7 @@ karabinerelements) name="Karabiner-Elements" type="pkgInDmg" downloadURL=$(downloadURLFromGit pqrs-org Karabiner-Elements) + appNewVersion=$(versionFromGit pqrs-org Karabiner-Elements) expectedTeamID="G43BCU2T37" ;; postman) @@ -978,6 +1209,7 @@ postman) name="Postman" type="zip" downloadURL="https://dl.pstmn.io/download/latest/osx" + appNewVersion=$(curl -Ifs https://dl.pstmn.io/download/latest/osx | grep "content-disposition:" | sed -n -e 's/^.*Postman-osx-//p' | sed 's/\.zip//' | sed $'s/[^[:print:]\t]//g' ) expectedTeamID="H7H8Q7M5CK" ;; jamfpppcutility) @@ -985,6 +1217,7 @@ jamfpppcutility) name="PPPC Utility" type="zip" downloadURL=$(downloadURLFromGit jamf PPPC-Utility) + appNewVersion=$(versionFromGit jamf PPPC-Utility) expectedTeamID="483DWKW443" ;; jamfmigrator) @@ -992,6 +1225,7 @@ jamfmigrator) name="jamf-migrator" type="zip" downloadURL=$(downloadURLFromGit jamf JamfMigrator) + #appNewVersion=$(versionFromGit jamf JamfMigrator) expectedTeamID="PS2F6S478M" ;; jamfreenroller) @@ -999,13 +1233,16 @@ jamfreenroller) name="ReEnroller" type="zip" downloadURL=$(downloadURLFromGit jamf ReEnroller) + #appNewVersion=$(versionFromGit jamf ReEnroller) expectedTeamID="PS2F6S478M" ;; adobereaderdc|\ adobereaderdc-install) name="Adobe Acrobat Reader DC" type="pkgInDmg" + packageID="com.adobe.acrobat.DC.reader.app.pkg.MUI" 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) + appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard) expectedTeamID="JQ525L2MZD" blockingProcesses=( "AdobeReader" ) ;; @@ -1013,28 +1250,39 @@ 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) + appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard) expectedTeamID="JQ525L2MZD" blockingProcesses=( "AdobeReader" ) ;; signal) - # credit: Søren Theilgaard + # credit: Søren Theilgaard (@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}') + appNewVersion=$(curl -fs https://updates.signal.org/desktop/latest-mac.yml | grep version | awk '{print $2}') expectedTeamID="U68MSDN6DR" ;; docker) - # credit: @securitygeneration + # credit: @securitygeneration name="Docker" type="dmg" downloadURL="https://download.docker.com/mac/stable/Docker.dmg" + appNewVersion=$(curl -ifs https://docs.docker.com/docker-for-mac/release-notes/ | grep ">Docker Desktop Community" | head -1 | sed -n -e 's/^.*Community //p' | cut -d '<' -f1) expectedTeamID="9BNSXJN65R" ;; brave) # credit: @securitygeneration name="Brave Browser" type="dmg" - downloadURL=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) + if [[ $(arch) != "i386" ]]; then + printlog "Architecture: arm64 (not i386)" + downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osxarm64/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n') + else + printlog "Architecture: i386" + downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osx/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n') + fi +# downloadURL=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) + appNewVersion=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) expectedTeamID="KL8N8XSYF4" ;; umbrellaroamingclient) @@ -1050,6 +1298,7 @@ umbrellaroamingclient) # name="VMware Fusion" # type="dmg" # downloadURL="https://www.vmware.com/go/getfusion" +# appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*Fusion-([0-9.]*)-.*/\1/g' ) # expectedTeamID="EG7KH642X6" # ;; @@ -1071,18 +1320,18 @@ umbrellaroamingclient) # expectedTeamID="UBF8T346G9" # ;; -wwdcformac) - name="WWDC" - type="zip" - downloadURL="https://cdn.wwdc.io/WWDC_latest.zip" - expectedTeamID="8C7439RJLG" - ;; +#wwdcformac) # this label looks like software/site is gone +# 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" + expectedTeamID="M932RC5J66" blockingProcesses=( "RingCentral Meetings" ) ;; ringcentralapp) @@ -1090,7 +1339,7 @@ ringcentralapp) name="Glip" type="dmg" downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac" - expectedTeamID="M932RC5J66" + expectedTeamID="M932RC5J66" blockingProcesses=( "Glip" ) ;; sfsymbols) @@ -1124,8 +1373,8 @@ 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 -m 1 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) + downloadURL=https://www.torproject.org$(curl -fs https://www.torproject.org/download/ | grep "downloadLink" | grep dmg | head -1 | cut -d '"' -f 4) + appNewVersion=$(curl -fs https://www.torproject.org/download/ | grep "downloadLink" | grep dmg | head -1 | cut -d '"' -f 4 | cut -d / -f 4) expectedTeamID="MADPSAYN6T" ;; code42) @@ -1141,27 +1390,40 @@ nomad) name="NoMAD" type="pkg" downloadURL="https://files.nomad.menu/NoMAD.pkg" + appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') expectedTeamID="VRPY9KHGX6" ;; +nomadlogin) + # credit: Søren Theilgaard (@theilgaard) + name="NoMAD Login" + type="pkg" + downloadURL="https://files.nomad.menu/NoMAD-Login-AD.pkg" + appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Login AD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') + expectedTeamID="AAPZK3CB24" + ;; bettertouchtool) - # credit: Tadayuki Onishi (@kenchan0130) + # credit: Søren Theilgaard (@theilgaard) name="BetterTouchTool" type="zip" downloadURL="https://folivora.ai/releases/BetterTouchTool.zip" + appNewVersion=$(curl -fs https://updates.folivora.ai/bettertouchtool_release_notes.html | grep BetterTouchTool | head -n 2 | tail -n 1 | sed -E 's/.* ([0-9\.]*) .*/\1/g') expectedTeamID="DAFVSXZ82P" ;; r) - # credit: Tadayuki Onishi (@kenchan0130) + # 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' ) + appNewVersion=$(curl -fsL https://formulae.brew.sh/api/cask/r.json | sed -n 's/^.*"version":"\([^"]*\)".*$/\1/p') expectedTeamID="VZLD955F6P" - ;; + ;; 8x8) # credit: #D-A-James from MacAdmins Slack and Isaac Ordonez, Mann consulting (@mannconsulting) name="8x8 Work" type="dmg" downloadURL=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}') + # As for appNewVersion, it needs to be checked for newer version than 7.2.4 + appNewVersion=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}' | sed -E 's/.*-v([0-9\.]*)[-\.]*.*/\1/' ) expectedTeamID="FC967L3QRG" ;; egnyte) @@ -1178,9 +1440,8 @@ camtasia) downloadURL=https://download.techsmith.com/camtasiamac/releases/Camtasia.dmg expectedTeamID="7TQL462TU8" ;; -snagit2020) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Snagit 2020" +snagit|snagit2021|snagit2020) + name="Snagit 2021" type="dmg" downloadURL="https://download.techsmith.com/snagitmac/releases/Snagit.dmg" expectedTeamID="7TQL462TU8" @@ -1192,6 +1453,7 @@ virtualbox) pkgName="VirtualBox.pkg" downloadURL=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" \ | awk -F '"' "/OSX.dmg/ { print \$4 }") + appNewVersion=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" | awk -F '"' "/OSX.dmg/ { print \$4 }" | sed -E 's/.*virtualbox\/([0-9.]*)\/.*/\1/') expectedTeamID="VB5E2TV963" ;; detectxswift) @@ -1199,14 +1461,16 @@ detectxswift) name="DetectX Swift" type="zip" downloadURL="https://s3.amazonaws.com/sqwarq.com/PublicZips/DetectX_Swift.app.zip" + appNewVersion=$(curl -fs https://s3.amazonaws.com/sqwarq.com/AppCasts/dtxswift_release_notes.html | grep Version | head -1 | sed -E 's/.*Version ([0-9.]*)\<.*/\1/') expectedTeamID="MAJ5XBJSG3" ;; autopkgr) - # credit: AP Orlebeke (@apizz) + # credit: Søren Theilgaard (@theilgaard) name="AutoPkgr" type="dmg" - downloadURL=$(curl -fs "https://api.github.com/repos/lindegroup/autopkgr/releases/latest" \ - | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") + #downloadURL=$(curl -fs "https://api.github.com/repos/lindegroup/autopkgr/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") + downloadURL=$(downloadURLFromGit lindegroup autopkgr) + appNewVersion=$(versionFromGit lindegroup autopkgr) expectedTeamID="JVY2ZR6SEF" ;; airserver) @@ -1214,14 +1478,16 @@ airserver) name="AirServer" type="dmg" downloadURL="https://www.airserver.com/download/mac/latest" + #appNewVersion=$() # Cannot find version history or release notes on home page expectedTeamID="6C755KS5W3" ;; vscodium) # credit: AP Orlebeke (@apizz) name="VSCodium" type="dmg" - downloadURL=$(curl -fs "https://api.github.com/repos/VSCodium/vscodium/releases/latest" \ - | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") + downloadURL=$(curl -fs "https://api.github.com/repos/VSCodium/vscodium/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") + #downloadURL=$(downloadURLFromGit VSCodium vscodium) # Too many versions + appNewVersion=$(versionFromGit VSCodium vscodium) expectedTeamID="C7S3ZQ2B8V" appName="VSCodium.app" blockingProcesses=( Electron ) @@ -1231,6 +1497,7 @@ keepassxc) name="KeePassXC" type="dmg" downloadURL="$(downloadURLFromGit keepassxreboot keepassxc)" + appNewVersion=$(versionFromGit keepassxreboot keepassxc) expectedTeamID="G2S7P7J672" ;; alfred) @@ -1238,6 +1505,7 @@ alfred) name="Alfred" type="dmg" downloadURL=$(curl -fs https://www.alfredapp.com | awk -F '"' "/dmg/ {print \$2}" | head -1) + appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*Alfred_([0-9.]*)_.*/\1/') appName="Alfred 4.app" expectedTeamID="XZZXE9SED4" ;; @@ -1247,6 +1515,7 @@ istatmenus) type="zip" downloadURL="https://download.bjango.com/istatmenus/" expectedTeamID="Y93TK974AT" + appNewVersion=$(curl -fs https://bjango.com/mac/istatmenus/versionhistory/ | grep "

" | head -1 | sed -E 's/

([0-9.]*)<\/h3>/\1/') blockingProcesses=( "iStat Menus" "iStatMenusAgent" "iStat Menus Status" ) ;; sizeup) @@ -1254,6 +1523,7 @@ sizeup) name="SizeUp" type="zip" downloadURL="https://www.irradiatedsoftware.com/download/SizeUp.zip" + appNewVersion=$(curl -fs https://www.irradiatedsoftware.com/updates/notes/SizeUpReleaseNotes.html | grep Version | sed -E 's/.*Version ([0-9.]*) <.*/\1/') expectedTeamID="GVZ7RF955D" ;; tunnelblick) @@ -1263,10 +1533,12 @@ tunnelblick) expectedTeamID="Z2SG5H3HC8" ;; yubikeymanagerqt) - # credit: Tadayuki Onishi (@kenchan0130) + # credit: Tadayuki Onishi (@kenchan0130) name="YubiKey Manager GUI" type="pkg" downloadURL="https://developers.yubico.com/yubikey-manager-qt/Releases/$(curl -sfL https://api.github.com/repos/Yubico/yubikey-manager-qt/releases/latest | awk -F '"' '/"tag_name"/ { print $4 }')-mac.pkg" + #appNewVersion=$(curl -fs https://developers.yubico.com/yubikey-manager-qt/Releases/ | grep mac.pkg | head -1 | sed -E "s/.*-([0-9.]*)-mac.*/\1/") # does not work + appNewVersion=$(versionFromGit Yubico yubikey-manager-qt) expectedTeamID="LQA3CS5MM7" ;; skitch) @@ -1289,7 +1561,7 @@ amazonworkspaces) name="Workspaces" type="pkg" downloadURL="https://d2td7dqidlhjx7.cloudfront.net/prod/global/osx/WorkSpaces.pkg" - # appNewVersion=$(curl -fs https://d2td7dqidlhjx7.cloudfront.net/prod/iad/osx/WorkSpacesAppCast_macOS_20171023.xml | grep -o "Version*.*<" | head -1 | cut -d " " -f2 | cut -d "<" -f1) + appNewVersion=$(curl -fs https://d2td7dqidlhjx7.cloudfront.net/prod/iad/osx/WorkSpacesAppCast_macOS_20171023.xml | grep -o "Version*.*<" | head -1 | cut -d " " -f2 | cut -d "<" -f1) expectedTeamID="94KV3E626L" ;; apparency) @@ -1298,158 +1570,88 @@ apparency) downloadURL="https://www.mothersruin.com/software/downloads/Apparency.dmg" expectedTeamID="936EB786NH" ;; -skype) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - # CONSUMER version of skype, business version is `microsoftskypeforbusiness` - name="Skype" - type="dmg" - downloadURL="https://get.skype.com/go/getskype-skypeformac" - expectedTeamID="AL798K98FX" - ;; bluejeans) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) name="BlueJeans" type="pkg" downloadURL=$(curl -fs "https://www.bluejeans.com/downloads" | xmllint --html --format - 2>/dev/null | grep -o "https://.*BlueJeansInstaller.dmg" | sed 's/dmg/pkg/g') + appNewVersion=$(echo $downloadURL | cut -d '/' -f6) expectedTeamID="HE4P42JBGN" + Company="Verizon" ;; -ricohpsprinters) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Ricoh PS Printers" - type="pkgInDmg" - downloadURL=$(curl -fs https://support.ricoh.com//bb/html/dr_ut_e/rc3/model/mpc3004ex/mpc3004exen.htm | xmllint --html --format - 2>/dev/null | grep -m 1 -o "https://.*.dmg" | cut -d '"' -f 1) - expectedTeamID="5KACUT3YX8" - ;; -ringcentralphone) - # credit: Eric Gjerde, When I Work (@ericgjerde on MacAdmins Slack) - # note: the DMG says RingCentral Phone, the installed app says RingCentral Phone, but the app in the DMG is 'RingCentral for Mac.app' - name="RingCentral for Mac" +skype) + name="Skype" type="dmg" - downloadURL="https://downloads.ringcentral.com/sp/RingCentralForMac" - expectedTeamID="M932RC5J66" - blockingProcesses=( "RingCentral Phone" ) - ;; -inkscape) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="Inkscape" - type="dmg" - downloadURL=https://inkscape.org$(inkscapemacurl=$(curl -s -L "https://inkscape.org/release/" | grep -Eio '/release/inkscape-(.*)/mac-os-x/([0-9]*)-([0-9]*)/dl/') && curl -s -L "https://inkscape.org$inkscapemacurl" | grep -Eio 'href="/gallery/item/([0-9]*)/(.*).dmg' | cut -c7-) - expectedTeamID="SW3D6BB6A6" - ;; -gimp) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="GIMP" - type="dmg" - downloadURL=https://$(curl -s -L "https://www.gimp.org/downloads/" | grep -Eio 'download.gimp.org/mirror/pub/gimp/v.*/osx/(.*).dmg') - expectedTeamID="T25BQ8HSJF" - ;; -qgis-macos-pr) - # credit: Rob Smithers (@SmithersJr on MacAdmins Slack) - name="QGIS" - type="dmg" - downloadURL="https://qgis.org/downloads/macos/qgis-macos-pr.dmg" - expectedTeamID="4F7N4UDA22" - ;; -osxfuse) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="FUSE for macOS" - type="pkgInDmg" - downloadURL=$(downloadURLFromGit osxfuse osxfuse) - expectedTeamID="3T5GSNBU6W" - ;; -veracrypt) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="VeraCrypt" - type="pkgInDmg" - downloadURL=$(curl -s -L "https://www.veracrypt.fr/en/Downloads.html" | grep -Eio 'href="https://launchpad.net/veracrypt/trunk/(.*)/+download/VeraCrypt_([0-9].*).dmg"' | cut -c7- | sed -e 's/"$//' | sed "s/+/+/g") - expectedTeamID="Z933746L2S" - ;; -cryptomator) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="Cryptomator" - type="dmg" - downloadURL=$(downloadURLFromGit cryptomator cryptomator) - expectedTeamID="YZQJQUHA3L" - ;; -prism7) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="Prism 7" - type="dmg" - downloadURL="http://cdn.graphpad.com/downloads/prism/7/InstallPrism7.dmg" - expectedTeamID="YQ2D36NS9M" - ;; -prism8) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="Prism 8" - type="dmg" - downloadURL="http://cdn.graphpad.com/downloads/prism/8/InstallPrism8.dmg" - expectedTeamID="YQ2D36NS9M" - ;; -snapgeneviewer) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="SnapGene Viewer" - type="dmg" - downloadURL="https://www.snapgene.com/local/targets/download.php?variant=viewer&os=mac&majorRelease=latest&minorRelease=latest" - expectedTeamID="WVCV9Q8Y78" - ;; -mattermost) - # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack) - name="Mattermost" - type="dmg" - downloadURL=$(downloadURLFromGit mattermost desktop) - expectedTeamID="UQ8HT4Q2XM" - ;; -thunderbird) - # credit: @N on MacAdmins Slack - name="Thunderbird" - type="dmg" - downloadURL="https://download.mozilla.org/?product=thunderbird-latest&os=osx&lang=en-US" - expectedTeamID="43AQ936H96" - blockingProcesses=( thunderbird ) - ;; -tigervnc) - # credit: @N on MacAdmins Slack - name="TigerVNC Viewer" - type="dmg" - downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/
Inkscape" | cut -d '>' -f 3 | cut -d '<' -f 1 | sed 's/[^0-9.]*//g') # Can't figure out where exact new version is found. Currently returns 1.0, but version is "1.0.0 (4035a4f)"
+    expectedTeamID="SW3D6BB6A6"
+    ;;
+xink)
+    name="Xink"
+    type="zip"
+    downloadURL="https://downloads.xink.io/macos/client"
+    #appNewVersion=$() # Cannot find version history or release notes on home page
+    expectedTeamID="F287823HVS"
+    ;;
+
 onlyofficedesktop)
     # credit: Adrian Bühler (@midni9ht)
     name="ONLYOFFICE"
@@ -1457,27 +1659,6 @@ onlyofficedesktop)
     downloadURL="https://download.onlyoffice.com/install/desktop/editors/mac/distrib/onlyoffice/ONLYOFFICE.dmg"
     expectedTeamID="2WH24U26GJ"
     ;;
-googleearth)
-    # credit: David Chatton (@mdmmac on MacAdmins Slack)
-    name="Google Earth Pro"
-    type="pkgInDmg"
-    downloadURL="https://dl.google.com/earth/client/advanced/current/GoogleEarthProMac-Intel.dmg"
-      expectedTeamID="EQHXZ8M8AV"
-    ;;
-pymol)
-    # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack)
-    name="PyMOL"
-    type="dmg"
-    downloadURL=$(curl -s -L "https://pymol.org/" | grep -m 1 -Eio 'href="https://pymol.org/installers/PyMOL-(.*)-MacOS(.*).dmg"' | cut -c7- | sed -e 's/"$//')
-    expectedTeamID="26SDDJ756N"
-    ;;
-prism9)
-    # credit: Fredrik Larsson (@fredrik_l on MacAdmins Slack)
-    name="Prism 9"
-    type="dmg"
-    downloadURL="http://cdn.graphpad.com/downloads/prism/9/InstallPrism9.dmg"
-    expectedTeamID="YQ2D36NS9M"
-    ;;  
 gpgsuite)
     # credit: Micah Lee (@micahflee)
     name="GPG Suite"
@@ -1500,39 +1681,35 @@ dangerzone)
     downloadURL=$(curl -s https://dangerzone.rocks/ | grep https://github.com/firstlookmedia/dangerzone/releases/download | grep \.dmg | cut -d'"' -f2)
     expectedTeamID="P24U45L8P5"
     ;;
+dbeaverce)
+    # credit: Adrian Bühler (@midni9ht)
+    name="DBeaver"
+    type="dmg"
+    downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg"
+    expectedTeamID="42B6MDKMW8"
+    blockingProcesses=( dbeaver )
+    ;;
+androidfiletransfer)
+    #credit: Sam Ess (saess-sep)
+    name="Android File Transfer"
+    type="dmg"
+    downloadURL="https://dl.google.com/dl/androidjumper/mtp/current/AndroidFileTransfer.dmg"
+    expectedTeamID="EQHXZ8M8AV"
+    ;;
 libreoffice)
     # credit: Micah Lee (@micahflee)
     name="LibreOffice"
     type="dmg"
     downloadURL="https://download.documentfoundation.org/libreoffice/stable/$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)/mac/x86_64/LibreOffice_$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)_MacOS_x86-64.dmg"
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)_.*/\1/g' )
     expectedTeamID="7P5S3ZLCN7"
     ;;
-sketch)
-    # credit: Alex L. (@aloew on MacAdmins Slack)
-    name="Sketch"
-    type="zip"
-    downloadURL="http://download.sketchapp.com/sketch.zip"
-    expectedTeamID="WUGMZZ5K46"
-    ;;
-abstract)
-    # credit: Alex L. (@aloew on MacAdmins Slack)
-    name="Abstract"
-    type="zip"
-    downloadURL="https://api.goabstract.com/releases/latest/download"
-    expectedTeamID="77MZLZE47D"
-    ;;  
-musescore)
-    # credit: @marcelclaus on MacAdmins Slack
-    name="MuseScore 3"
-    type="dmg"
-    downloadURL=$(downloadURLFromGit musescore MuseScore)
-    expectedTeamID="6EPAF2X3PR"
-    ;;
 toggltrack)
     # credit: Adrian Bühler (@midni9ht)
     name="Toggl Track"
     type="dmg"
     downloadURL=$(downloadURLFromGit toggl-open-source toggldesktop )
+    appNewVersion=$(versionFromGit toggl-open-source toggldesktop )
     expectedTeamID="B227VTMZ94"
     ;;
 balenaetcher)
@@ -1540,154 +1717,22 @@ balenaetcher)
     name="balenaEtcher"
     type="dmg"
     downloadURL=$(downloadURLFromGit balena-io etcher )
+    appNewVersion=$(versionFromGit balena-io etcher )
     expectedTeamID="66H43P8FRG"
     ;;
-figma)
-    # credit: Alex L. (@aloew on MacAdmins Slack)
-    name="Figma"
-    type="zip"
-    downloadURL="https://www.figma.com/download/desktop/mac/"
-    expectedTeamID="T8RA8NE3B7"
-    ;;
-jetbrainsidea)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains IntelliJ Idea"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=IIU&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=IIU&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;;
-jetbrainspycharm)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains PyCharm"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCP&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=PCP&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainsrubymine)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains RubyMine"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=RM&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=RM&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainswebstorm)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains Webstorm"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=WS&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=WS&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainsdatagrip)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains DataGrip"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=DG&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainsclion)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains CLion"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=CL&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=CL&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainsgoland)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains GoLand"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=GO&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=GO&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;; 
-jetbrainsrider)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains Rider"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=RD&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=RD&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;;
-jetbrainsappcode)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="JetBrains AppCode"
-    type="dmg"
-    expectedTeamID="2ZEFAR8TH3"
-    #appNewVersion=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=AC&latest=true&type=release" | grep -o 'version*.*,' | cut -d '"' -f3)
-    downloadURL=$(curl -fs "https://data.services.jetbrains.com/products/releases?code=AC&latest=true&type=release" | grep -o "mac*.*.dmg" | cut -d '"' -f5)
-    ;;  
-jetbrainsideace|\
-intellijideace)
-    # credit: Alex L. (@aloew on MacAdmins Slack)
-    name="IntelliJ IDEA CE"
-    type="dmg"
-    downloadURL="https://download.jetbrains.com/product?code=IIC&latest&distribution=mac"
-    expectedTeamID="2ZEFAR8TH3"
-    ;;
-jetbrainspycharmce|\
-pycharmce)
-    # credit: Alex L. (@aloew on MacAdmins Slack)
-    name="PyCharm CE"
-    type="dmg"
-    downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=mac"
-    expectedTeamID="2ZEFAR8TH3"
-    ;;
-pitch)
-    #credit: @evil mwnci on MacAdmins Slack
-    name="Pitch"
-    type="dmg"
-    downloadURL="https://desktop.pitch.com/mac/Pitch.dmg"
-    expectedTeamID="KUCN8NUU6Z"
-    ;;
-sidekick)
-    #credit: @evil mwnci on MacAdmins Slack
-    name="Sidekick"
-    type="dmg"
-    downloadURL="https://api.meetsidekick.com/downloads/df/mac"
-    expectedTeamID="N975558CUS"
-    ;;
-aircall)
-    # credit: @kris-anderson
-    name="Aircall"
-    type="dmg"
-    downloadURL="https://electron.aircall.io/download/osx"
-    expectedTeamID="3ML357Q795"
-    ;; 
-plantronicshub)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="Plantronics Hub"
-    type="pkgInDmg"
-    pkgName="Plantronics Software.pkg"
-    downloadURL="https://www.poly.com/content/dam/www/software/PlantronicsHubInstaller.dmg"
-    expectedTeamID="SKWK2Q7JJV"
-    #appNewVersion=$(curl -fs "https://www.poly.com/in/en/support/knowledge-base/kb-article-page?lang=en_US&urlName=Hub-Release-Notes&type=Product_Information__kav" | grep -o "(*.*)" | head -1 | cut -d "(" -f2 | sed 's/\<\/span\>//g' | cut -d "<" -f1)
-    ;;
-jabradirect)
-    # credit: Casey Jensen (@cajenson01 on MacAdmins Slack)
-    name="Jabra Direct"
-    type="pkgInDmg"
-    pkgName="JabraDirectSetup.pkg"
-    downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg"
-    expectedTeamID="55LV32M29R"
-    #appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
-    ;;
 fsmonitor)
-     # credit: Adrian Bühler (@midni9ht)
-     name="FSMonitor"
-     type="zip"
-     downloadURL=$(curl --location --fail --silent "https://fsmonitor.com/FSMonitor/Archives/appcast2.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null  | cut -d '"' -f 2)
-     expectedTeamID="V85GBYB7B9"
-     ;;
+    # credit: Adrian Bühler (@midni9ht)
+    name="FSMonitor"
+    type="zip"
+    downloadURL=$(curl --location --fail --silent "https://fsmonitor.com/FSMonitor/Archives/appcast2.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null  | cut -d '"' -f 2)
+    expectedTeamID="V85GBYB7B9"
+    ;;
 ramboxce)
     # credit: Adrian Bühler (@midni9ht)
     name="Rambox"
     type="dmg"
     downloadURL=$(downloadURLFromGit ramboxapp community-edition )
+    appNewVersion=$(versionFromGit ramboxapp community-edition )
     expectedTeamID="7F292FPD69"
     ;;
 adobebrackets)
@@ -1695,6 +1740,7 @@ adobebrackets)
     name="Brackets"
     type="dmg"
     downloadURL=$(downloadURLFromGit adobe brackets )
+    appNewVersion=$(versionFromGit adobe brackets )
     expectedTeamID="JQ525L2MZD"
     ;;
 debookee)
@@ -1709,6 +1755,7 @@ ferdi)
     name="Ferdi"
     type="dmg"
     downloadURL=$(downloadURLFromGit getferdi ferdi )
+    appNewVersion=$(versionFromGit getferdi ferdi )
     expectedTeamID="B6J9X9DWFL"
     ;;
 hyper)
@@ -1716,6 +1763,7 @@ hyper)
     name="Hyper"
     type="dmg"
     downloadURL=$(downloadURLFromGit vercel hyper )
+    appNewVersion=$(versionFromGit vercel hyper)
     expectedTeamID="JW6Y669B67"
     ;;
 menumeters)
@@ -1723,32 +1771,389 @@ menumeters)
     name="MenuMeters"
     type="zip"
     downloadURL=$(downloadURLFromGit yujitach MenuMeters )
+    appNewVersion=$(versionFromGit yujitach MenuMeters )
     expectedTeamID="95AQ7YKR5A"
     ;;
+webexteams)
+    # credit: Erik Stam (@erikstam)
+    name="Webex"
+    type="dmg"
+    downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg"
+    #appNewVersion=$() # Cannot find version history or release notes on home page
+    expectedTeamID="DE8Y96K9QP"
+    ;;
+mattermost)
+    name="Mattermost"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit mattermost desktop)
+    appNewVersion=$(versionFromGit mattermost desktop )
+    expectedTeamID="UQ8HT4Q2XM"
+    ;;
+bitwarden)
+    name="Bitwarden"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit bitwarden desktop )
+    appNewVersion=$(versionFromGit bitwarden desktop )
+    expectedTeamID="LTZ2PFU5D6"
+    ;;
+thunderbird)
+    name="Thunderbird"
+    type="dmg"
+    downloadURL="https://download.mozilla.org/?product=thunderbird-latest&os=osx&lang=en-US"
+    expectedTeamID="43AQ936H96"
+    blockingProcesses=( thunderbird )
+    ;;
+tigervnc)
+    name="TigerVNC Viewer"
+    type="dmg"
+    downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/
)" | head -1 | cut -d "(" -f2 | sed 's/\<\/span\>//g' | cut -d "<" -f1)
+    ;;
+jabradirect)
+    name="Jabra Direct"
+    type="dmg"
+    downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg"
+    expectedTeamID="55LV32M29R"
+    appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
+    ;;
 vagrant)
     # credit: AP Orlebeke (@apizz)
     name="Vagrant"
     type="pkgInDmg"
     pkgName="vagrant.pkg"
-    downloadURL=$(curl -fs https://www.vagrantup.com/downloads.html \
-        | tr '><' '\n' | awk -F'"' '/x86_64.dmg/ {print $6}' | head -1)
+    downloadURL=$(curl -fs https://www.vagrantup.com/downloads | tr '><' '\n' | awk -F'"' '/x86_64.dmg/ {print $6}' | head -1)
+    #appNewVersion=$( curl -fs https://www.vagrantup.com/downloads.html | grep -i "Current Version" )
+    appNewVersion=$(versionFromGit hashicorp vagrant)
     expectedTeamID="D38WU7D763"
     ;;
-jamfconnect)
-    #credit: @marcelclaus on MacAdmins Slack
-    name="JamfConnect"
-    type="pkgInDmg"
-    downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
-    expectedTeamID="483DWKW443"
+aircall)
+    # credit: @kris-anderson
+    name="Aircall"
+    type="dmg"
+    downloadURL="https://electron.aircall.io/download/osx"
+    expectedTeamID="3ML357Q795"
+    ;;
+installomator_st)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Installomator"
+    type="pkg"
+    packageID="dk.theilgaard.pkg.Installomator"
+    downloadURL=$(downloadURLFromGit theile Installomator )
+    appNewVersion=$(versionFromGit theile Installomator )
+    expectedTeamID="L8W73B6AH3"
+    blockingProcesses=( NONE )
     ;;
 etrecheck)
-    #credit: David Schultz (@dvsjr on MacAdmins Slack)
+    # credit: @dvsjr macadmins slack
     name="EtreCheckPro"
     type="zip"
     downloadURL="https://cdn.etrecheck.com/EtreCheckPro.zip"
     expectedTeamID="U87NE528LC"
     ;;
-
+hazel)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Hazel"
+    type="dmg"
+    downloadURL=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')
+    appNewVersion=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
+    expectedTeamID="86Z3GCJ4MF"
+    ;;
+cormorant)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Cormorant"
+    type="zip"
+    downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g')
+    appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "$name [0-9.]*" | awk '{print $2}')
+    expectedTeamID="QWY4LRW926"
+    ;;
+silnite)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="silnite"
+    type="pkgInZip"
+    downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g')
+    appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "silnite [0-9.]*" | awk '{print $2}')
+    expectedTeamID="QWY4LRW926"
+    blockingProcesses=( NONE )
+    ;;
+devonthink)
+    # It's a zipped dmg file, needs function installAppInDmgInZip
+    # credit: Søren Theilgaard (@theilgaard)
+    name="DEVONthink 3"
+    type="appInDmgInZip"
+    downloadURL=$( curl -fs https://www.devontechnologies.com/apps/devonthink | grep -i "download.devon" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' )
+    appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 )
+    expectedTeamID="679S2QUWR8"
+    ;;
+vanilla)
+    # credit: Adrian Bühler (@midni9ht)
+    name="Vanilla"
+    type="dmg"
+    downloadURL="https://macrelease.matthewpalmer.net/Vanilla.dmg"
+    expectedTeamID="Z4JV2M65MH"
+    ;;
+taskpaper)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="TaskPaper"
+    type="dmg"
+    downloadURL="https://www.taskpaper.com/assets/app/TaskPaper.dmg"
+    expectedTeamID="64A5CLJP5W"
+    ;;
+calibre)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="calibre"
+    type="dmg"
+    downloadURL="https://calibre-ebook.com/dist/osx"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="NTY7FVCEKP"
+    ;;
+redeye)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="Red Eye"
+    type="zip"
+    downloadURL="https://www.hexedbits.com/downloads/redeye.zip"
+    appNewVersion=$( curl -fs "https://www.hexedbits.com/redeye/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' )
+    expectedTeamID="5VRJU68BZ5"
+    ;;
+lucifer)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="Lucifer"
+    type="zip"
+    downloadURL="https://www.hexedbits.com/downloads/lucifer.zip"
+    appNewVersion=$( curl -fs "https://www.hexedbits.com/lucifer/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' )
+    expectedTeamID="5VRJU68BZ5"
+    ;;
+fantastical)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="Fantastical"
+    type="zip"
+    downloadURL="https://flexibits.com/fantastical/download"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
+    expectedTeamID="85C27NK92C"
+    ;;
+launchbar)
+    name="LaunchBar"
+    type="dmg"
+    downloadURL=$(curl -fs "https://obdev.at/products/launchbar/download.html" | xmllint --html --format - 2>/dev/null | grep -m 1 -o "https://.*.dmg")
+    appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="MLZF7K7B5R"
+    ;;
+klokki)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Klokki"
+    type="dmg"
+    downloadURL="https://storage.yandexcloud.net/klokki/Klokki.dmg"
+    expectedTeamID="Q9SATZMHPG"
+    ;;
+notion)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Notion"
+    type="dmg"
+    if [[ $(arch) == "arm64" ]]; then
+        downloadURL="https://www.notion.so/desktop/apple-silicon/download"
+    elif [[ $(arch) == "i386" ]]; then
+        downloadURL="https://www.notion.so/desktop/mac/download"
+    fi
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="LBQJ96FQ8D"
+    ;;
+lexarrecoverytool)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Lexar Recovery Tool"
+    type="appInDmgInZip"
+    downloadURL="https://www.lexar.com$( curl -fs https://www.lexar.com/support/downloads/ | grep -i "mac" | grep -i "recovery" | head -1 | tr '"' '\n' | grep -i ".zip"  )"
+    #appNewVersion=""
+    expectedTeamID="Y8HM6WR2DV"
+    ;;
+easeusdatarecoverywizard)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="EaseUS Data Recovery Wizard"
+    type="dmg"
+    downloadURL=$( curl -fsIL https://down.easeus.com/product/mac_drw_free_setup | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' )
+    #appNewVersion=""
+    expectedTeamID="DLLVW95FSM"
+    ;;
+lastpass)
+    name="LastPass"
+    type="dmg"
+    downloadURL="https://download.cloud.lastpass.com/mac/LastPass.dmg"
+    expectedTeamID="N24REP3BMN"
+    Company="Marvasol, Inc DBA LastPass"
+    ;;
+front)
+    name="Front"
+    type="dmg"
+    downloadURL="https://dl.frontapp.com/macos/Front.dmg"
+    expectedTeamID="X549L7572J"
+    Company="FrontApp. Inc."
+    ;;
+telegram)
+    name="Telegram"
+    type="dmg"
+    downloadURL="https://telegram.org/dl/macos"
+    appNewVersion=$( curl -fs https://macos.telegram.org | grep anchor | head -1 | sed -E 's/.*a>([0-9.]*) .*/\1/g' )
+    expectedTeamID="6N38VWS5BX"
+    ;;
+obsidian)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Obsidian"
+    type="dmg"
+    if [[ $(arch) == "arm64" ]]; then
+        downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep "arm64" )
+    elif [[ $(arch) == "i386" ]]; then
+        downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep -v "arm64" )
+    fi
+    appNewVersion=$(versionFromGit obsidianmd obsidian-releases)
+    expectedTeamID="6JSW4SJWN9"
+    ;;
+wickrme)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="WickrMe"
+    type="dmg"
+    downloadURL=$( curl -fs https://me-download.wickr.com/api/download/me/download/mac | tr '"' '\n' | grep -e '^https://' )
+    appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="W8RC3R952A"
+    ;;
+wickrpro)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="WickrPro"
+    type="dmg"
+    downloadURL=$( curl -fs https://me-download.wickr.com/api/download/pro/download/mac | tr '"' '\n' | grep -e '^https://' )
+    appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="W8RC3R952A"
+    ;;
+exelbanstats)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Stats"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit exelban stats)
+    appNewVersion=$(versionFromGit exelban stats)
+    expectedTeamID="RP2S87B72W"
+    ;;
+onionshare)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="OnionShare"
+    type="pkg"
+    downloadURL="https://onionshare.org$(curl -fs https://onionshare.org | grep "button.*pkg" | tr '"' '\n' | grep ".pkg")"
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="N9B95FDWH4"
+    ;;
+keyboardmaestro)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Keyboard Maestro"
+    type="zip"
+    downloadURL="https://download.keyboardmaestro.com/"
+    #appNewVersion=$( curl -fs https://www.stairways.com/press/ | grep -i "releases Keyboard Maestro" | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # Text based from web site
+    appNewVersion=$( curl -fs "https://www.stairways.com/press/rss.xml" | xpath '//rss/channel/item/title[contains(text(), "releases Keyboard Maestro")]' 2>/dev/null | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # uses XML, so might be a little more precise/future proof
+    expectedTeamID="QMHRBA4LGH"
+    blockingProcesses=( "Keyboard Maestro Engine" "Keyboard Maestro" )
+    ;;
+loom)
+    # credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
+    name="Loom"
+    type="dmg"
+    downloadURL=https://cdn.loom.com/desktop-packages/$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/url/ && /dmg/ {print $3}' | head -1)
+    appNewVersion=$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/version/ {print $2}' )
+    expectedTeamID="QGD2ZPXZZG"
+    ;;
+golang)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="GoLang"
+    type="pkg"
+    packageID="org.golang.go"
+    downloadURL="$(curl -fsIL "https://golang.org$(curl -fs "https://golang.org/dl/" | grep -i "downloadBox" | grep "pkg" | tr '"' '\n' | grep "pkg")" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')"
+    appNewVersion="$( echo "${downloadURL}" | sed -E 's/.*\/(go[0-9.]*)\..*/\1/g' )" # Version includes letters "go"
+    expectedTeamID="EQHXZ8M8AV"
+    blockingProcesses=( NONE )
+    ;;
+rectangle)
+    name="Rectangle"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit rxhanson Rectangle)
+    appNewVersion=$(versionFromGit rxhanson Rectangle)
+    expectedTeamID="XSYZ3E4B7D"
+    ;;
+knockknock)
+    name="KnockKnock"
+    type="zip"
+    downloadURL=$( curl -fs "https://objective-see.com/products/knockknock.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
+    expectedTeamID="VBG97UB4TA"
+    ;;
+lulu)
+    name="LuLu"
+    type="dmg"
+    downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
+    expectedTeamID="VBG97UB4TA"
+    ;;
+element)
+    # credit: Adrian Bühler (@midni9ht)
+    name="Element"
+    type="dmg"
+    downloadURL="https://packages.riot.im/desktop/install/macos/Element.dmg"
+    expectedTeamID="7J4U792NQT"
+    ;;
+teamviewerhost)
+    name="TeamViewerHost"
+    type="pkgInDmg"
+    packageID="com.teamviewer.teamviewerhost"
+    downloadURL="https://download.teamviewer.com/download/TeamViewerHost.dmg"
+    expectedTeamID="H7UGFBUGV6"
+    #blockingProcessesMaxCPU="5" # Future feature
+    #Company="TeamViewer GmbH"
+    ;;
+amazonchime)
+    # credit: @dvsjr macadmins slack
+    name="Amazon Chime"
+    type="dmg"
+    downloadURL="https://clients.chime.aws/mac/latest"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="94KV3E626L"
+    #Company="Amazon"
+    ;;
+basecamp3)
+    #credit: @matins
+    name="Basecamp 3"
+    type="dmg"
+    downloadURL="https://bc3-desktop.s3.amazonaws.com/mac/basecamp3.dmg"
+    expectedTeamID="2WNYUYRS7G"
+    appName="Basecamp 3.app"
+    ;;
+proctortrack)
+    #credit: Jeff F. (@jefff on MacAdmins Slack)
+    name="Proctortrack"
+    type="zip"
+    downloadURL="https://storage.googleapis.com/verificientstatic/ProctortrackApp/Production/Proctortrack.zip"
+    expectedTeamID="SNHZD6TJE6"
+    #Company="Verificient Technologies"
+    ;;
+viscosity)
+    #credit: @matins
+    name="Viscosity"
+    type="dmg"
+    downloadURL="https://www.sparklabs.com/downloads/Viscosity.dmg"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*%20([0-9.]*)\..*/\1/g' )
+    expectedTeamID="34XR7GXFPX"
+    ;;
 
 # MARK: add new labels above here
 
@@ -1788,10 +2193,11 @@ microsoftofficebusinesspro)
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install )
     ;;
-microsoftedgeconsumerstable)
+microsoftedgeconsumerstable|microsoftedge)
     name="Microsoft Edge"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=2069148"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.edge"]/cfbundleversion' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps EDGE01 )
@@ -1800,6 +2206,7 @@ microsoftcompanyportal)
     name="Company Portal"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=869655"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.intunecompanyportal.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps IMCP01 )
@@ -1808,6 +2215,7 @@ microsoftskypeforbusiness)
     name="Skype for Business"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=832978"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.skypeforbusiness.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps MSFB16 )
@@ -1816,6 +2224,7 @@ microsoftremotedesktop)
     name="Microsoft Remote Desktop"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=868963"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.remotedesktop.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps MSRD10 )
@@ -1824,15 +2233,26 @@ microsoftteams)
     name="Microsoft Teams"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=869428"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.teams.standalone"]/version' 2>/dev/null | sed -E 's/([0-9.]*) .*/\1/')
     expectedTeamID="UBF8T346G9"
     blockingProcesses=( Teams "Microsoft Teams Helper" )
-    updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
-    updateToolArguments=( --install --apps TEAM01 )
+    #updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
+    #updateToolArguments=( --install --apps TEAM01 )
+    ;;
+microsoftyammer)
+    name="Yammer"
+    type="dmg"
+    downloadURL="https://aka.ms/yammer_desktop_mac"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/oldpackage[id="com.microsoft.yammer.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
+    expectedTeamID="UBF8T346G9"
+    #updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
+    #updateToolArguments=( --install --apps ?????? )
     ;;
 microsoftautoupdate)
     name="Microsoft AutoUpdate"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=830196"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.autoupdate.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     # commented the updatetool for MSAutoupdate, because when Autoupdate is really
     # old or broken, you want to force a new install
@@ -1843,6 +2263,7 @@ microsoftedgeenterprisestable)
     name="Microsoft Edge"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=2093438"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.edge"]/version' 2>/dev/null | sed -E 's/([0-9.]*) .*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps EDGE01 )
@@ -1851,6 +2272,7 @@ microsoftword)
     name="Microsoft Word"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=525134"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.word.standalone.365"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps MSWD2019 )
@@ -1859,6 +2281,7 @@ microsoftexcel)
     name="Microsoft Excel"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=525135"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.excel.standalone.365"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps XCEL2019 )
@@ -1867,6 +2290,7 @@ microsoftpowerpoint)
     name="Microsoft PowerPoint"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=525136"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.powerpoint.standalone.365"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps PPT32019 )
@@ -1875,6 +2299,7 @@ microsoftoutlook)
     name="Microsoft Outlook"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=525137"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.outlook.standalone.365"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps OPIM2019 )
@@ -1883,6 +2308,7 @@ microsoftonenote)
     name="Microsoft OneNote"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=820886"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.onenote.standalone.365"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps ONMC2019 )
@@ -1891,6 +2317,7 @@ microsoftonedrive)
     name="OneDrive"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=823060"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.onedrive.standalone"]/cfbundleshortversionstring' 2>/dev/null | sed -E 's/([0-9.]*)<.*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps ONDR18 )
@@ -1899,6 +2326,7 @@ microsoftsharepointplugin)
     name="MicrosoftSharePointPlugin"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=800050"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.sharepointplugin.standalone"]/version' 2>/dev/null | sed -E 's/([0-9.]*) .*/\1/')
     expectedTeamID="UBF8T346G9"
     # TODO: determine blockingProcesses for SharePointPlugin
     ;;
@@ -1906,6 +2334,7 @@ visualstudiocode)
     name="Visual Studio Code"
     type="zip"
     downloadURL="https://go.microsoft.com/fwlink/?LinkID=620882"
+    appNewVersion=$(curl -fsL "https://code.visualstudio.com/Updates" | grep "/darwin" | grep -oiE ".com/([^>]+)([^<]+)/darwin" | cut -d "/" -f 2 | sed $'s/[^[:print:]\t]//g')
     expectedTeamID="UBF8T346G9"
     appName="Visual Studio Code.app"
     blockingProcesses=( Electron )
@@ -1914,20 +2343,22 @@ microsoftdefenderatp)
     name="Microsoft Defender ATP"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=2097502"
+    appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.defender.standalone"]/version' 2>/dev/null | sed -E 's/([0-9.]*) .*/\1/')
     expectedTeamID="UBF8T346G9"
     updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
     updateToolArguments=( --install --apps WDAV00 )
     ;;
 microsoftlicenseremovaltool)
-    # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
+    # credit: Isaac Ordonez (@isaac) macadmins slack
     name="Microsoft License Removal Tool"
     type="pkg"
     downloadURL="https://go.microsoft.com/fwlink/?linkid=849815"
     expectedTeamID="QGS93ZLCU7"
-    # appNewVersion=$(curl -is "$downloadURL" | grep ocation: | grep -o "Microsoft_.*pkg" | cut -d "_" -f 5 | cut -d "." -f1-2)
+    appNewVersion=$(curl -is "$downloadURL" | grep ocation: | grep -o "Microsoft_.*pkg" | cut -d "_" -f 5 | cut -d "." -f1-2)
+    Company="Microsoft"
+    PatchSkip="YES"
     ;;
 
-
 # this description is so you can provide all variables as arguments
 # it will only check if the required variables are setting
 valuesfromarguments)
@@ -1971,14 +2402,16 @@ brokenteamid)
     ;;
 *)
     # unknown label
-    printlog "unknown label $label"
-    exit 1
+    #printlog "unknown label $label"
+    cleanupAndExit 1 "unknown label $label"
     ;;
 esac
 
 
 # MARK: application download and installation starts here
 
+printlog "BLOCKING_PROCESS_ACTION=${BLOCKING_PROCESS_ACTION}"
+printlog "NOTIFY=${NOTIFY}"
 
 # MARK: extract info from data
 if [ -z "$archiveName" ]; then
@@ -1989,7 +2422,7 @@ if [ -z "$archiveName" ]; then
         pkgInDmg)
             archiveName="${name}.dmg"
             ;;
-        pkgInZip)
+        *InZip)
             archiveName="${name}.zip"
             ;;
         *)
@@ -2006,7 +2439,7 @@ fi
 
 if [ -z "$targetDir" ]; then
     case $type in
-        dmg|zip|tbz)
+        dmg|zip|tbz|app*)
             targetDir="/Applications"
             ;;
         pkg*)
@@ -2053,8 +2486,53 @@ if [[ -n $appVersion ]]; then
     fi
 fi
 
-# MARK: when user is logged in, and app is running, prompt user to quit app
+# MARK: Exit if new version is the same as installed version (appNewVersion specified)
+# credit: Søren Theilgaard (@theilgaard)
+if [[ -n $appNewVersion ]]; then
+    printlog "Latest version of $name is $appNewVersion"
+    if [[ $appversion == $appNewVersion ]]; then
+        if [[ $DEBUG -eq 0 ]]; then
+            printlog "There is no newer version available."
+            if [[ $INSTALL != "force" ]]; then
+                message="$name, version $appNewVersion, is  the latest version."
+                if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
+                    printlog "notifying"
+                    displaynotification "$message" "No update for $name!"
+                fi
+                cleanupAndExit 0 "No newer version."
+            else
+                printlog "Using force to install anyway."
+            fi
+        else
+            printlog "DEBUG mode enabled, not exiting, but there is no new version of app."
+        fi
+    fi
+else
+    printlog "Latest version not specified."
+fi
 
+# MARK: download the archive
+if [ -f "$archiveName" ] && [ "$DEBUG" -ne 0 ]; then
+    printlog "$archiveName exists and DEBUG enabled, skipping download"
+else
+    # download the dmg
+    printlog "Downloading $downloadURL to $archiveName"
+    if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
+        printlog "notifying"
+        displaynotification "Downloading $name update" "Download in progress …"
+    fi
+    if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then
+        printlog "error downloading $downloadURL"
+        message="$name update/installation failed. This will be logged, so IT can follow up."
+        if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
+            printlog "notifying"
+            displaynotification "$message" "Error installing/updating $name"
+        fi
+        cleanupAndExit 2
+    fi
+fi
+
+# 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"
 else
@@ -2067,20 +2545,12 @@ else
     fi
 fi
 
-# MARK: download the archive
-
-if [ -f "$archiveName" ] && [ "$DEBUG" -ne 0 ]; then
-    printlog "$archiveName exists and DEBUG enabled, skipping download"
-else
-    # download the dmg
-    printlog "Downloading $downloadURL to $archiveName"
-    if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then
-        printlog "error downloading $downloadURL"
-        cleanupAndExit 2
-    fi
-fi
-
 # MARK: install the download
+printlog "Installing $name"
+if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
+    printlog "notifying"
+    displaynotification "Installing $name" "Installation in progress …"
+fi
 
 case $type in
     dmg)
@@ -2101,6 +2571,9 @@ case $type in
     pkgInZip)
         installPkgInZip
         ;;
+    appInDmgInZip)
+        installAppInDmgInZip
+        ;;
     *)
         printlog "Cannot handle type $type"
         cleanupAndExit 99
@@ -2119,7 +2592,7 @@ fi
 
 printlog "$message"
 
-if [[ $currentUser != "loginwindow" && $NOTIFY == "success" ]]; then
+if [[ $currentUser != "loginwindow" && ( $NOTIFY == "success" || $NOTIFY == "all" ) ]]; then
     printlog "notifying"
     displaynotification "$message" "$name update/installation complete!"
 fi

From a93fc8d6dc2725e2179bf2394b1f49ca7c397dad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Mon, 15 Feb 2021 21:46:26 +0100
Subject: [PATCH 02/17] Labels alphabetically

---
 Installomator.sh | 2587 ++++++++++++++++++++++++----------------------
 1 file changed, 1324 insertions(+), 1263 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 8647ea6..eb2bea0 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -683,8 +683,8 @@ fi
 # MARK: argument parsing
 if [[ $# -eq 0 ]]; then
     printlog "no label provided, printing labels"
-    grep -E '^[a-z0-9\-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
-    #grep -E '^[a-z0-9\-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
+    grep -E '^[a-z0-9\-_]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
+    #grep -E '^[a-z0-9\-_]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
     exit 0
 elif [[ $1 == "/" ]]; then
     # jamf uses sends '/' as the first argument
@@ -724,11 +724,144 @@ version)
     ;;
 longversion)
     # print the script version
-    printlog "Installomater: version $VERSION ($VERSIONDATE)"
+    printlog "Installomator location:"
+    printlog "${SELFLOCATION}/${SELF}"
+    printlog "Labels file:"
+    printlog "$labelFile"
+    printlog "Version $VERSION ($VERSIONDATE), branch $VERSIONBRANCH, Labels file version $labelsVERSION"
     exit 0
     ;;
 
 # label descriptions start here
+1password7)
+    name="1Password 7"
+    type="pkg"
+    downloadURL="https://app-updates.agilebits.com/download/OPM7"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[0-9a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="2BUA8C4S2C"
+    ;;
+8x8)
+    # credit: #D-A-James from MacAdmins Slack and Isaac Ordonez, Mann consulting (@mannconsulting)
+    name="8x8 Work"
+    type="dmg"
+    downloadURL=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}')
+    # As for appNewVersion, it needs to be checked for newer version than 7.2.4
+    appNewVersion=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}' | sed -E 's/.*-v([0-9\.]*)[-\.]*.*/\1/' )
+    expectedTeamID="FC967L3QRG"
+    ;;
+adobebrackets)
+    # credit: Adrian Bühler (@midni9ht)
+    name="Brackets"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit adobe brackets )
+    appNewVersion=$(versionFromGit adobe brackets )
+    expectedTeamID="JQ525L2MZD"
+    ;;
+adobeconnect)
+    # credit: Oh4sh0 https://github.com/Oh4sh0
+    # Comment by Søren: I do not know this software.
+    # Looks like it's an Adobe installer in an app, so it will probably not work
+    name="AdobeConnectInstaller"
+    type="dmg"
+    downloadURL="http://www.adobe.com/go/ConnectSetupMac"
+    appNewVersion=$(curl -fs https://helpx.adobe.com/adobe-connect/connect-downloads-updates.html | grep "Mac" | grep version | head -1 | sed -E 's/.*\(version ([0-9\.]*),.*/\1/g')
+    expectedTeamID="JQ525L2MZD"
+    ;;
+adobereaderdc|\
+adobereaderdc-install)
+    name="Adobe Acrobat Reader DC"
+    type="pkgInDmg"
+    packageID="com.adobe.acrobat.DC.reader.app.pkg.MUI"
+    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)
+    appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
+    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)
+    appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
+    expectedTeamID="JQ525L2MZD"
+    blockingProcesses=( "AdobeReader" )
+    ;;
+aircall)
+    # credit: @kris-anderson
+    name="Aircall"
+    type="dmg"
+    downloadURL="https://electron.aircall.io/download/osx"
+    expectedTeamID="3ML357Q795"
+    ;;
+airserver)
+    # credit: AP Orlebeke (@apizz)
+    name="AirServer"
+    type="dmg"
+    downloadURL="https://www.airserver.com/download/mac/latest"
+    #appNewVersion=$() # Cannot find version history or release notes on home page
+    expectedTeamID="6C755KS5W3"
+    ;;
+alfred)
+    # credit: AP Orlebeke (@apizz)
+    name="Alfred"
+    type="dmg"
+    downloadURL=$(curl -fs https://www.alfredapp.com | awk -F '"' "/dmg/ {print \$2}" | head -1)
+    appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*Alfred_([0-9.]*)_.*/\1/')
+    appName="Alfred 4.app"
+    expectedTeamID="XZZXE9SED4"
+    ;;
+amazonchime)
+    # credit: @dvsjr macadmins slack
+    name="Amazon Chime"
+    type="dmg"
+    downloadURL="https://clients.chime.aws/mac/latest"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="94KV3E626L"
+    #Company="Amazon"
+    ;;
+amazonworkspaces)
+    # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
+    name="Workspaces"
+    type="pkg"
+    downloadURL="https://d2td7dqidlhjx7.cloudfront.net/prod/global/osx/WorkSpaces.pkg"
+    appNewVersion=$(curl -fs https://d2td7dqidlhjx7.cloudfront.net/prod/iad/osx/WorkSpacesAppCast_macOS_20171023.xml | grep -o "Version*.*<" | head -1 | cut -d " " -f2 | cut -d "<" -f1)
+    expectedTeamID="94KV3E626L"
+    ;;
+androidfiletransfer)
+    #credit: Sam Ess (saess-sep)
+    name="Android File Transfer"
+    type="dmg"
+    downloadURL="https://dl.google.com/dl/androidjumper/mtp/current/AndroidFileTransfer.dmg"
+    expectedTeamID="EQHXZ8M8AV"
+    ;;
+apparency)
+    name="Apparency"
+    type="dmg"
+    downloadURL="https://www.mothersruin.com/software/downloads/Apparency.dmg"
+    expectedTeamID="936EB786NH"
+    ;;
+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"
+    ;;
+aquaskk)
+    # credit: Tadayuki Onishi (@kenchan0130)
+    name="aquaskk"
+    type="pkg"
+    downloadURL=$(downloadURLFromGit codefirst aquaskk)
+    appNewVersion=$(versionFromGit codefirst aquaskk)
+    expectedTeamID="FPZK4WRGW7"
+    ;;
+atom)
+    name="Atom"
+    type="zip"
+    archiveName="atom-mac.zip"
+    downloadURL=$(downloadURLFromGit atom atom )
+    appNewVersion=$(versionFromGit atom atom)
+    expectedTeamID="VEKTX9H2N7"
+    ;;
 autodmg)
     # credit: Mischa van der Bent (@mischavdbent)
     name="AutoDMG"
@@ -737,6 +870,353 @@ autodmg)
     appNewVersion=$(versionFromGit MagerValp AutoDMG)
     expectedTeamID="5KQ3D3FG5H"
     ;;
+autopkgr)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="AutoPkgr"
+    type="dmg"
+    #downloadURL=$(curl -fs "https://api.github.com/repos/lindegroup/autopkgr/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }")
+    downloadURL=$(downloadURLFromGit lindegroup autopkgr)
+    appNewVersion=$(versionFromGit lindegroup autopkgr)
+    expectedTeamID="JVY2ZR6SEF"
+    ;;
+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"
+    ;;
+balenaetcher)
+    # credit: Adrian Bühler (@midni9ht)
+    name="balenaEtcher"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit balena-io etcher )
+    appNewVersion=$(versionFromGit balena-io etcher )
+    expectedTeamID="66H43P8FRG"
+    ;;
+basecamp3)
+    #credit: @matins
+    name="Basecamp 3"
+    type="dmg"
+    downloadURL="https://bc3-desktop.s3.amazonaws.com/mac/basecamp3.dmg"
+    expectedTeamID="2WNYUYRS7G"
+    appName="Basecamp 3.app"
+    ;;
+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)
+    appNewVersion=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort  | tail -n1 | sed -E 's/.*BBEdit_([0-9 .]*)\.dmg.*/\1/')
+    expectedTeamID="W52GZAXT98"
+    ;;
+bettertouchtool)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="BetterTouchTool"
+    type="zip"
+    downloadURL="https://folivora.ai/releases/BetterTouchTool.zip"
+    appNewVersion=$(curl -fs https://updates.folivora.ai/bettertouchtool_release_notes.html | grep BetterTouchTool | head -n 2 | tail -n 1 | sed -E 's/.* ([0-9\.]*) .*/\1/g')
+    expectedTeamID="DAFVSXZ82P"
+    ;;
+bitwarden)
+    name="Bitwarden"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit bitwarden desktop )
+    appNewVersion=$(versionFromGit bitwarden desktop )
+    expectedTeamID="LTZ2PFU5D6"
+    ;;
+bluejeans)
+    name="BlueJeans"
+    type="pkg"
+    downloadURL=$(curl -fs "https://www.bluejeans.com/downloads" | xmllint --html --format - 2>/dev/null | grep -o "https://.*BlueJeansInstaller.dmg" | sed 's/dmg/pkg/g')
+    appNewVersion=$(echo $downloadURL | cut -d '/' -f6)
+    expectedTeamID="HE4P42JBGN"
+    Company="Verizon"
+    ;;
+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"
+    ;;
+brave)
+    # credit: @securitygeneration
+    name="Brave Browser"
+    type="dmg"
+    if [[ $(arch) != "i386" ]]; then
+        printlog "Architecture: arm64 (not i386)"
+        downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osxarm64/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')
+    else
+        printlog "Architecture: i386"
+        downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osx/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')
+    fi
+#    downloadURL=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null  | cut -d '"' -f 2)
+    appNewVersion=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@sparkle:shortVersionString' 2>/dev/null  | cut -d '"' -f 2)
+    expectedTeamID="KL8N8XSYF4"
+    ;;
+calibre)
+    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
+    name="calibre"
+    type="dmg"
+    downloadURL="https://calibre-ebook.com/dist/osx"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="NTY7FVCEKP"
+    ;;
+camostudio)
+    # credit: Søren Theilgaard (@theilgaard)
+    name="Camo Studio"
+    type="zip"
+    downloadURL="https://reincubate.com/res/labs/camo/camo-macos-latest.zip"
+    #appNewVersion=$(  ) # Can't find any versioniing on web server
+    expectedTeamID="Q248YREB53"
+    ;;
+camtasia)
+    name="Camtasia 2020"
+    type="dmg"
+    downloadURL=https://download.techsmith.com/camtasiamac/releases/Camtasia.dmg
+    expectedTeamID="7TQL462TU8"
+    ;;
+citrixworkspace)
+    #credit: Erik Stam (@erikstam) and #Philipp on MacAdmins Slack
+    name="Citrix Workspace"
+    type="pkgInDmg"
+    downloadURL="https:"$(curl -s -L "https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html#ctx-dl-eula-external" | grep "dmg?" | sed "s/.*rel=.\(.*\)..id=.*/\1/") # http://downloads.citrix.com/18823/CitrixWorkspaceApp.dmg?__gda__=1605791892_edc6786a90eb5197fb226861a8e27aa8
+    appNewVersion=$(curl -fs https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html | grep "

Version" | head -1 | cut -d " " -f1 | cut -d ";" -f2 | cut -d "." -f 1-3) + expectedTeamID="S272Y5R93J" + ;; +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 ) + ;; +coderunner) + # credit: Erik Stam (@erikstam) + name="CodeRunner" + type="zip" + downloadURL="https://coderunnerapp.com/download" + expectedTeamID="R4GD98AJF9" + ;; +cormorant) + # credit: Søren Theilgaard (@theilgaard) + name="Cormorant" + type="zip" + downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g') + appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "$name [0-9.]*" | awk '{print $2}') + expectedTeamID="QWY4LRW926" + ;; +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 ) + appNewVersion=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2 ) + expectedTeamID="G69SCX94XU" + ;; +dangerzone) + # credit: Micah Lee (@micahflee) + name="Dangerzone" + type="dmg" + downloadURL=$(curl -s https://dangerzone.rocks/ | grep https://github.com/firstlookmedia/dangerzone/releases/download | grep \.dmg | cut -d'"' -f2) + expectedTeamID="P24U45L8P5" + ;; +dbeaverce) + # credit: Adrian Bühler (@midni9ht) + name="DBeaver" + type="dmg" + downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg" + expectedTeamID="42B6MDKMW8" + blockingProcesses=( dbeaver ) + ;; +debookee) + # credit: Adrian Bühler (@midni9ht) + name="Debookee" + type="zip" + downloadURL=$(curl --location --fail --silent "https://www.iwaxx.com/debookee/appcast.xml" | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="AATLWWB4MZ" + ;; +depnotify) + name="DEPNotify" + type="zip" + downloadURL="https://files.nomad.menu/DEPNotify.zip" + expectedTeamID="VRPY9KHGX6" + targetDir="/Applications/Utilities" + ;; +desktoppr) + name="desktoppr" + type="pkg" + packageID="com.scriptingosx.desktoppr" + downloadURL=$(downloadURLFromGit "scriptingosx" "desktoppr") + appNewVersion=$(versionFromGit "scriptingosx" "desktoppr") + expectedTeamID="JME5BW3F3R" + blockingProcesses=( NONE ) + ;; +detectxswift) + # credit: AP Orlebeke (@apizz) + name="DetectX Swift" + type="zip" + downloadURL="https://s3.amazonaws.com/sqwarq.com/PublicZips/DetectX_Swift.app.zip" + appNewVersion=$(curl -fs https://s3.amazonaws.com/sqwarq.com/AppCasts/dtxswift_release_notes.html | grep Version | head -1 | sed -E 's/.*Version ([0-9.]*)\<.*/\1/') + expectedTeamID="MAJ5XBJSG3" + ;; +devonthink) + # It's a zipped dmg file, needs function installAppInDmgInZip + # credit: Søren Theilgaard (@theilgaard) + name="DEVONthink 3" + type="appInDmgInZip" + downloadURL=$( curl -fs https://www.devontechnologies.com/apps/devonthink | grep -i "download.devon" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' ) + appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 ) + expectedTeamID="679S2QUWR8" + ;; +dialpad) + # credit: @ehosaka + name="Dialpad" + type="dmg" + downloadURL="https://storage.googleapis.com/dialpad_native/osx/Dialpad.dmg" + expectedTeamID="9V29MQSZ9M" + ;; +discord) + name="Discord" + type="dmg" + downloadURL="https://discordapp.com/api/download?platform=osx" + expectedTeamID="53Q6R32WPB" + ;; +docker) + # credit: @securitygeneration + name="Docker" + type="dmg" + downloadURL="https://download.docker.com/mac/stable/Docker.dmg" + appNewVersion=$(curl -ifs https://docs.docker.com/docker-for-mac/release-notes/ | grep ">Docker Desktop Community" | head -1 | sed -n -e 's/^.*Community //p' | cut -d '<' -f1) + expectedTeamID="9BNSXJN65R" + ;; +dropbox) + name="Dropbox" + type="dmg" + downloadURL="https://www.dropbox.com/download?plat=mac&full=1" + expectedTeamID="G7HH3F8CAK" + ;; +easeusdatarecoverywizard) + # credit: Søren Theilgaard (@theilgaard) + name="EaseUS Data Recovery Wizard" + type="dmg" + downloadURL=$( curl -fsIL https://down.easeus.com/product/mac_drw_free_setup | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' ) + #appNewVersion="" + expectedTeamID="DLLVW95FSM" + ;; +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 ) + ;; +element) + # credit: Adrian Bühler (@midni9ht) + name="Element" + type="dmg" + downloadURL="https://packages.riot.im/desktop/install/macos/Element.dmg" + expectedTeamID="7J4U792NQT" + ;; +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" + ;; +etrecheck) + # credit: @dvsjr macadmins slack + name="EtreCheckPro" + type="zip" + downloadURL="https://cdn.etrecheck.com/EtreCheckPro.zip" + expectedTeamID="U87NE528LC" + ;; +exelbanstats) + # credit: Søren Theilgaard (@theilgaard) + name="Stats" + type="dmg" + downloadURL=$(downloadURLFromGit exelban stats) + appNewVersion=$(versionFromGit exelban stats) + expectedTeamID="RP2S87B72W" + ;; +fantastical) + # credit: Drew Diver (@grumpydrew on MacAdmins Slack) + name="Fantastical" + type="zip" + downloadURL="https://flexibits.com/fantastical/download" + appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' ) + expectedTeamID="85C27NK92C" + ;; +ferdi) + # credit: Adrian Bühler (@midni9ht) + name="Ferdi" + type="dmg" + downloadURL=$(downloadURLFromGit getferdi ferdi ) + appNewVersion=$(versionFromGit getferdi ferdi ) + expectedTeamID="B6J9X9DWFL" + ;; +firefox) + name="Firefox" + type="dmg" + downloadURL="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" + appNewVersion=$(/usr/bin/curl https://www.mozilla.org/en-US/firefox/releases/ --silent | /usr/bin/grep '/dev/null | cut -d '"' -f 2) + expectedTeamID="V85GBYB7B9" + ;; +githubdesktop) + name="GitHub Desktop" + type="zip" + downloadURL="https://central.github.com/deployments/desktop/desktop/latest/darwin" + appNewVersion=$(curl -fsL https://central.github.com/deployments/desktop/desktop/changelog.json | awk -F '{' '/"version"/ { print $2 }' | sed -E 's/.*,\"version\":\"([0-9.]*)\".*/\1/g') + expectedTeamID="VEKTX9H2N7" + ;; +golang) + # credit: Søren Theilgaard (@theilgaard) + name="GoLang" + type="pkg" + packageID="org.golang.go" + downloadURL="$(curl -fsIL "https://golang.org$(curl -fs "https://golang.org/dl/" | grep -i "downloadBox" | grep "pkg" | tr '"' '\n' | grep "pkg")" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')" + appNewVersion="$( echo "${downloadURL}" | sed -E 's/.*\/(go[0-9.]*)\..*/\1/g' )" # Version includes letters "go" + expectedTeamID="EQHXZ8M8AV" + blockingProcesses=( NONE ) + ;; googlechrome) name="Google Chrome" type="dmg" @@ -764,6 +1244,16 @@ googlechromepkg) updateToolArguments=( -runMode oneshot -userInitiated YES ) updateToolRunAsCurrentUser=1 ;; +googledrive|\ +googledrivefilestream) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Google Drive File Stream" + type="pkgInDmg" + packageID="com.google.drivefs" + downloadURL="https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg" # downloadURL="https://dl.google.com/drive-file-stream/GoogleDrive.dmg" + blockingProcesses=( "Google Docs" "Google Drive" "Google Sheets" "Google Slides" ) + expectedTeamID="EQHXZ8M8AV" + ;; googlejapaneseinput) # credit: Tadayuki Onishi (@kenchan0130) name="GoogleJapaneseInput" @@ -772,74 +1262,233 @@ googlejapaneseinput) downloadURL="https://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg" expectedTeamID="EQHXZ8M8AV" ;; -santa) - # credit: Tadayuki Onishi (@kenchan0130) - name="Santa" +gpgsuite) + # credit: Micah Lee (@micahflee) + name="GPG Suite" type="pkgInDmg" - packageID="com.google.santa" - downloadURL=$(downloadURLFromGit google santa) - appNewVersion=$(versionFromGit google santa) - expectedTeamID="EQHXZ8M8AV" + pkgName="Install.pkg" + downloadURL=$(curl -s https://gpgtools.org/ | grep https://releases.gpgtools.org/GPG_Suite- | grep Download | cut -d'"' -f4) + expectedTeamID="PKV8ZPD836" ;; -spotify) - name="Spotify" - type="dmg" - downloadURL="https://download.scdn.co/Spotify.dmg" - # appNewVersion=$(curl -fs https://www.spotify.com/us/opensource/ | cat | grep -o ".*." | head -1 | cut -d ">" -f2 | cut -d "<" -f1) # does not result in the same version as downloaded - 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) - appNewVersion=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort | tail -n1 | sed -E 's/.*BBEdit_([0-9 .]*)\.dmg.*/\1/') - expectedTeamID="W52GZAXT98" - ;; -firefox) - name="Firefox" - type="dmg" - downloadURL="https://download.mozilla.org/?product=firefox-latest&os=osx&lang=en-US" - appNewVersion=$(/usr/bin/curl https://www.mozilla.org/en-US/firefox/releases/ --silent | /usr/bin/grep 'Inkscape" | cut -d '>' -f 3 | cut -d '<' -f 1 | sed 's/[^0-9.]*//g') # Can't figure out where exact new version is found. Currently returns 1.0, but version is "1.0.0 (4035a4f)" + expectedTeamID="SW3D6BB6A6" + ;; +installomator_st) + # credit: Søren Theilgaard (@theilgaard) + name="Installomator" type="pkg" - packageID="com.scriptingosx.desktoppr" - downloadURL=$(downloadURLFromGit "scriptingosx" "desktoppr") - appNewVersion=$(versionFromGit "scriptingosx" "desktoppr") - expectedTeamID="JME5BW3F3R" + packageID="dk.theilgaard.pkg.Installomator" + downloadURL=$(downloadURLFromGit theile Installomator ) + appNewVersion=$(versionFromGit theile Installomator ) + expectedTeamID="L8W73B6AH3" blockingProcesses=( NONE ) ;; +istatmenus) + # credit: AP Orlebeke (@apizz) + name="iStat Menus" + type="zip" + downloadURL="https://download.bjango.com/istatmenus/" + expectedTeamID="Y93TK974AT" + appNewVersion=$(curl -fs https://bjango.com/mac/istatmenus/versionhistory/ | grep "

" | head -1 | sed -E 's/

([0-9.]*)<\/h3>/\1/') + blockingProcesses=( "iStat Menus" "iStatMenusAgent" "iStat Menus Status" ) + ;; +iterm2) + name="iTerm" + type="zip" + downloadURL="https://iterm2.com/downloads/stable/latest" + appNewVersion=$(curl -is https://iterm2.com/downloads/stable/latest | grep location: | grep -o "iTerm2.*zip" | cut -d "-" -f 2 | cut -d '.' -f1 | sed 's/_/./g') + expectedTeamID="H7V7XYVQ7D" + blockingProcesses=( iTerm2 ) + ;; +jabradirect) + name="Jabra Direct" + type="dmg" + downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg" + expectedTeamID="55LV32M29R" + appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1) + ;; +jamfmigrator) + # credit: Mischa van der Bent + name="jamf-migrator" + type="zip" + downloadURL=$(downloadURLFromGit jamf JamfMigrator) + #appNewVersion=$(versionFromGit jamf JamfMigrator) + expectedTeamID="PS2F6S478M" + ;; +jamfpppcutility) + # credit: Mischa van der Bent + name="PPPC Utility" + type="zip" + downloadURL=$(downloadURLFromGit jamf PPPC-Utility) + appNewVersion=$(versionFromGit jamf PPPC-Utility) + expectedTeamID="483DWKW443" + ;; +jamfreenroller) + # credit: Mischa van der Bent + name="ReEnroller" + type="zip" + downloadURL=$(downloadURLFromGit jamf ReEnroller) + #appNewVersion=$(versionFromGit jamf ReEnroller) + expectedTeamID="PS2F6S478M" + ;; +karabinerelements) + # credit: Tadayuki Onishi (@kenchan0130) + name="Karabiner-Elements" + type="pkgInDmg" + downloadURL=$(downloadURLFromGit pqrs-org Karabiner-Elements) + appNewVersion=$(versionFromGit pqrs-org Karabiner-Elements) + expectedTeamID="G43BCU2T37" + ;; +keepassxc) + # credit: Patrick Atoon (@raptor399) + name="KeePassXC" + type="dmg" + downloadURL="$(downloadURLFromGit keepassxreboot keepassxc)" + appNewVersion=$(versionFromGit keepassxreboot keepassxc) + expectedTeamID="G2S7P7J672" + ;; +keka) + # credit: Adrian Bühler (@midni9ht) + name="Keka" + type="dmg" + downloadURL=$(downloadURLFromGit aonez Keka) + appNewVersion=$(versionFromGit aonez Keka) + expectedTeamID="4FG648TM2A" + ;; +keyboardmaestro) + # credit: Søren Theilgaard (@theilgaard) + name="Keyboard Maestro" + type="zip" + downloadURL="https://download.keyboardmaestro.com/" + #appNewVersion=$( curl -fs https://www.stairways.com/press/ | grep -i "releases Keyboard Maestro" | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # Text based from web site + appNewVersion=$( curl -fs "https://www.stairways.com/press/rss.xml" | xpath '//rss/channel/item/title[contains(text(), "releases Keyboard Maestro")]' 2>/dev/null | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # uses XML, so might be a little more precise/future proof + expectedTeamID="QMHRBA4LGH" + blockingProcesses=( "Keyboard Maestro Engine" "Keyboard Maestro" ) + ;; +klokki) + # credit: Søren Theilgaard (@theilgaard) + name="Klokki" + type="dmg" + downloadURL="https://storage.yandexcloud.net/klokki/Klokki.dmg" + expectedTeamID="Q9SATZMHPG" + ;; +knockknock) + name="KnockKnock" + type="zip" + downloadURL=$( curl -fs "https://objective-see.com/products/knockknock.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" ) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' ) + expectedTeamID="VBG97UB4TA" + ;; +krisp) + # credit: Tadayuki Onishi (@kenchan0130) + name="Krisp" + type="pkg" + downloadURL="https://download.krisp.ai/mac" + expectedTeamID="U5R26XM5Z2" + ;; +lastpass) + name="LastPass" + type="dmg" + downloadURL="https://download.cloud.lastpass.com/mac/LastPass.dmg" + expectedTeamID="N24REP3BMN" + Company="Marvasol, Inc DBA LastPass" + ;; +launchbar) + name="LaunchBar" + type="dmg" + downloadURL=$(curl -fs "https://obdev.at/products/launchbar/download.html" | xmllint --html --format - 2>/dev/null | grep -m 1 -o "https://.*.dmg") + appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="MLZF7K7B5R" + ;; +lexarrecoverytool) + # credit: Søren Theilgaard (@theilgaard) + name="Lexar Recovery Tool" + type="appInDmgInZip" + downloadURL="https://www.lexar.com$( curl -fs https://www.lexar.com/support/downloads/ | grep -i "mac" | grep -i "recovery" | head -1 | tr '"' '\n' | grep -i ".zip" )" + #appNewVersion="" + expectedTeamID="Y8HM6WR2DV" + ;; +libreoffice) + # credit: Micah Lee (@micahflee) + name="LibreOffice" + type="dmg" + downloadURL="https://download.documentfoundation.org/libreoffice/stable/$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)/mac/x86_64/LibreOffice_$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)_MacOS_x86-64.dmg" + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)_.*/\1/g' ) + expectedTeamID="7P5S3ZLCN7" + ;; +loom) + # credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack) + name="Loom" + type="dmg" + downloadURL=https://cdn.loom.com/desktop-packages/$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/url/ && /dmg/ {print $3}' | head -1) + appNewVersion=$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/version/ {print $2}' ) + expectedTeamID="QGD2ZPXZZG" + ;; +lucifer) + # credit: Drew Diver (@grumpydrew on MacAdmins Slack) + name="Lucifer" + type="zip" + downloadURL="https://www.hexedbits.com/downloads/lucifer.zip" + appNewVersion=$( curl -fs "https://www.hexedbits.com/lucifer/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' ) + expectedTeamID="5VRJU68BZ5" + ;; +lulu) + name="LuLu" + type="dmg" + downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" ) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' ) + expectedTeamID="VBG97UB4TA" + ;; malwarebytes) name="Malwarebytes" type="pkg" @@ -847,27 +1496,82 @@ malwarebytes) appNewVersion=$(curl -Ifs https://downloads.malwarebytes.com/file/mb3-mac | grep "location" | sed -E 's/.*-Mac-([0-9\.]*)\.pkg/\1/g') expectedTeamID="GVZRY6KDKR" ;; -suspiciouspackage) - # credit: Mischa van der Bent (@mischavdbent) - name="Suspicious Package" +mattermost) + name="Mattermost" type="dmg" - downloadURL="https://mothersruin.com/software/downloads/SuspiciousPackage.dmg" - addNewVersion=$(curl -fs https://mothersruin.com/software/SuspiciousPackage/get.html | grep 'class="version"' | sed -E 's/.*>([0-9\.]*) \(.*/\1/g') - expectedTeamID="936EB786NH" + downloadURL=$(downloadURLFromGit mattermost desktop) + appNewVersion=$(versionFromGit mattermost desktop ) + expectedTeamID="UQ8HT4Q2XM" ;; -atom) - name="Atom" +menumeters) + # credit: Adrian Bühler (@midni9ht) + name="MenuMeters" type="zip" - archiveName="atom-mac.zip" - downloadURL=$(downloadURLFromGit atom atom ) - appNewVersion=$(versionFromGit atom atom) - expectedTeamID="VEKTX9H2N7" + downloadURL=$(downloadURLFromGit yujitach MenuMeters ) + appNewVersion=$(versionFromGit yujitach MenuMeters ) + expectedTeamID="95AQ7YKR5A" ;; -eraseinstall) - name="EraseInstall" +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) + appNewVersion=$(curl -fs https://ranchero.com/downloads/netnewswire-release.xml | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="M8L2WTLA8W" + ;; +nomad) + # credit: Tadayuki Onishi (@kenchan0130) + name="NoMAD" 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" + downloadURL="https://files.nomad.menu/NoMAD.pkg" + appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') + expectedTeamID="VRPY9KHGX6" + ;; +nomadlogin) + # credit: Søren Theilgaard (@theilgaard) + name="NoMAD Login" + type="pkg" + downloadURL="https://files.nomad.menu/NoMAD-Login-AD.pkg" + appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Login AD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') + expectedTeamID="AAPZK3CB24" + ;; +notion) + # credit: Søren Theilgaard (@theilgaard) + name="Notion" + type="dmg" + if [[ $(arch) == "arm64" ]]; then + downloadURL="https://www.notion.so/desktop/apple-silicon/download" + elif [[ $(arch) == "i386" ]]; then + downloadURL="https://www.notion.so/desktop/mac/download" + fi + appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="LBQJ96FQ8D" + ;; +obsidian) + # credit: Søren Theilgaard (@theilgaard) + name="Obsidian" + type="dmg" + if [[ $(arch) == "arm64" ]]; then + downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep "arm64" ) + elif [[ $(arch) == "i386" ]]; then + downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep -v "arm64" ) + fi + appNewVersion=$(versionFromGit obsidianmd obsidian-releases) + expectedTeamID="6JSW4SJWN9" + ;; +omnidisksweeper) + name="OmniDiskSweeper" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniDiskSweeper" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" + ;; +omnifocus3) + name="OmniFocus" + type="dmg" + downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniFocus3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) + expectedTeamID="34YW5XSRB7" ;; omnigraffle6) name="OmniGraffle" @@ -883,13 +1587,6 @@ omnigraffle7) appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) expectedTeamID="34YW5XSRB7" ;; -omnifocus3) - name="OmniFocus" - type="dmg" - downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniFocus3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) - appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) - expectedTeamID="34YW5XSRB7" - ;; omnioutliner5) name="OmniOutliner" type="dmg" @@ -911,98 +1608,20 @@ omnipresence) appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) expectedTeamID="34YW5XSRB7" ;; -omnidisksweeper) - name="OmniDiskSweeper" - type="dmg" - downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniDiskSweeper" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) +onionshare) + # credit: Søren Theilgaard (@theilgaard) + name="OnionShare" + type="pkg" + downloadURL="https://onionshare.org$(curl -fs https://onionshare.org | grep "button.*pkg" | tr '"' '\n' | grep ".pkg")" appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) - expectedTeamID="34YW5XSRB7" + expectedTeamID="N9B95FDWH4" ;; -vlc) - name="VLC" +onlyofficedesktop) + # credit: Adrian Bühler (@midni9ht) + name="ONLYOFFICE" type="dmg" - if [[ $(arch) == "arm64" ]]; then - downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 ) - appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 ) - elif [[ $(arch) == "i386" ]]; then - 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 ) - appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 ) - fi - expectedTeamID="75GAHG3SZQ" - ;; -textmate) - name="TextMate" - type="tbz" - #downloadURL="https://api.textmate.org/downloads/release?os=10.12" - downloadURL=$(downloadURLFromGit "textmate" "textmate") - appNewVersion=$(versionFromGit "textmate" "textmate") - 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 ) - appNewVersion=$(curl -fs https://product-downloads.atlassian.com/software/sourcetree/Appcast/SparkleAppcastAlpha.xml | xpath '//rss/channel/item[last()]/title' 2>/dev/null | sed -n -e 's/^.*Version //p' | sed 's/\<\/title\>//' | sed $'s/[^[:print:]\t]//g') - 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" - appNewVersion=$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" "https://zoom.us/download" | grep Version | head -n 1 | sed -E 's/.* ([0-9.]* \(.*\)).*/\1/') # credit: Søren Theilgaard (@theilgaard) - 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" + downloadURL="https://download.onlyoffice.com/install/desktop/editors/mac/distrib/onlyoffice/ONLYOFFICE.dmg" + expectedTeamID="2WH24U26GJ" ;; openvpnconnect) # credit: Erik Stam (@erikstam) @@ -1025,12 +1644,417 @@ pacifist) downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg" expectedTeamID="HRLUCP7QP4" ;; -1password7) - name="1Password 7" +pitch) + name="Pitch" + type="dmg" + downloadURL="https://desktop.pitch.com/mac/Pitch.dmg" + expectedTeamID="KUCN8NUU6Z" + ;; +plantronicshub) + name="Plantronics Hub" + type="dmg" + downloadURL="https://www.poly.com/content/dam/www/software/PlantronicsHubInstaller.dmg" + expectedTeamID="SKWK2Q7JJV" + appNewVersion=$(curl -fs "https://www.poly.com/in/en/support/knowledge-base/kb-article-page?lang=en_US&urlName=Hub-Release-Notes&type=Product_Information__kav" | grep -o "(*.*)" | head -1 | cut -d "(" -f2 | sed 's/\<\/span\>//g' | cut -d "<" -f1) + ;; +plisteditpro) + name="PlistEdit Pro" + type="zip" + downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip" + expectedTeamID="8NQ43ND65V" + ;; +postman) + # credit: Mischa van der Bent + name="Postman" + type="zip" + downloadURL="https://dl.pstmn.io/download/latest/osx" + appNewVersion=$(curl -Ifs https://dl.pstmn.io/download/latest/osx | grep "content-disposition:" | sed -n -e 's/^.*Postman-osx-//p' | sed 's/\.zip//' | sed $'s/[^[:print:]\t]//g' ) + expectedTeamID="H7H8Q7M5CK" + ;; +privileges) + # credit: Erik Stam (@erikstam) + name="Privileges" + type="zip" + downloadURL=$(downloadURLFromGit sap macOS-enterprise-privileges ) + appNewVersion=$(versionFromGit sap macOS-enterprise-privileges ) + expectedTeamID="7R5ZEU67FQ" + ;; +proctortrack) + #credit: Jeff F. (@jefff on MacAdmins Slack) + name="Proctortrack" + type="zip" + downloadURL="https://storage.googleapis.com/verificientstatic/ProctortrackApp/Production/Proctortrack.zip" + expectedTeamID="SNHZD6TJE6" + #Company="Verificient Technologies" + ;; +r) + # credit: Tadayuki Onishi (@kenchan0130) + name="R" type="pkg" - downloadURL="https://app-updates.agilebits.com/download/OPM7" - appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[0-9a-zA-Z]*-([0-9.]*)\..*/\1/g' ) - expectedTeamID="2BUA8C4S2C" + downloadURL=$( curl -fsL https://formulae.brew.sh/api/cask/r.json | sed -n 's/^.*"url":"\([^"]*\)".*$/\1/p' ) + appNewVersion=$(curl -fsL https://formulae.brew.sh/api/cask/r.json | sed -n 's/^.*"version":"\([^"]*\)".*$/\1/p') + expectedTeamID="VZLD955F6P" + ;; +ramboxce) + # credit: Adrian Bühler (@midni9ht) + name="Rambox" + type="dmg" + downloadURL=$(downloadURLFromGit ramboxapp community-edition ) + appNewVersion=$(versionFromGit ramboxapp community-edition ) + expectedTeamID="7F292FPD69" + ;; +rectangle) + name="Rectangle" + type="dmg" + downloadURL=$(downloadURLFromGit rxhanson Rectangle) + appNewVersion=$(versionFromGit rxhanson Rectangle) + expectedTeamID="XSYZ3E4B7D" + ;; +redeye) + # credit: Drew Diver (@grumpydrew on MacAdmins Slack) + name="Red Eye" + type="zip" + downloadURL="https://www.hexedbits.com/downloads/redeye.zip" + appNewVersion=$( curl -fs "https://www.hexedbits.com/redeye/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' ) + expectedTeamID="5VRJU68BZ5" + ;; +resiliosynchome) + name="Resilio Sync" + type="dmg" + downloadURL="https://download-cdn.resilio.com/stable/osx/Resilio-Sync.dmg" + expectedTeamID="2953Z5SZSK" + ;; +ringcentralapp) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Glip" + type="dmg" + downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac" + expectedTeamID="M932RC5J66" + blockingProcesses=( "Glip" ) + ;; +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" ) + ;; +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) + appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) + expectedTeamID="VXP8K9EDP6" + ;; +santa) + # credit: Tadayuki Onishi (@kenchan0130) + name="Santa" + type="pkgInDmg" + packageID="com.google.santa" + downloadURL=$(downloadURLFromGit google santa) + appNewVersion=$(versionFromGit google santa) + expectedTeamID="EQHXZ8M8AV" + ;; +sfsymbols) + name="SF Symbols" + type="pkgInDmg" + downloadURL="https://developer.apple.com/design/downloads/SF-Symbols.dmg" + expectedTeamID="Software Update" + ;; +sidekick) + name="Sidekick" + type="dmg" + downloadURL="https://api.meetsidekick.com/downloads/df/mac" + expectedTeamID="N975558CUS" + ;; +signal) + # credit: Søren Theilgaard (@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}') + appNewVersion=$(curl -fs https://updates.signal.org/desktop/latest-mac.yml | grep version | awk '{print $2}') + expectedTeamID="U68MSDN6DR" + ;; +silnite) + # credit: Søren Theilgaard (@theilgaard) + name="silnite" + type="pkgInZip" + downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g') + appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "silnite [0-9.]*" | awk '{print $2}') + expectedTeamID="QWY4LRW926" + blockingProcesses=( NONE ) + ;; +sizeup) + # credit: AP Orlebeke (@apizz) + name="SizeUp" + type="zip" + downloadURL="https://www.irradiatedsoftware.com/download/SizeUp.zip" + appNewVersion=$(curl -fs https://www.irradiatedsoftware.com/updates/notes/SizeUpReleaseNotes.html | grep Version | sed -E 's/.*Version ([0-9.]*) <.*/\1/') + expectedTeamID="GVZ7RF955D" + ;; +sketch) + name="Sketch" + type="zip" + downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g') + appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page + expectedTeamID="WUGMZZ5K46" + ;; +skitch) + # credit: Isaac Ordonez, Mann consulting (@mannconsulting) + name="Skitch" + type="zip" + downloadURL=$(curl -fs -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1 Safari/605.1.15" https://evernote.com/products/skitch | grep -o "https://.*zip") + expectedTeamID="J8RPQ294UB" + Company="Evernote" + ;; +skype) + name="Skype" + type="dmg" + downloadURL="https://get.skype.com/go/getskype-skypeformac" + appNewVersion=$(curl -is "https://get.skype.com/go/getskype-skypeformac" | grep ocation: | grep -o "Skype-.*dmg" | cut -d "-" -f 2 | cut -d "." -f1-2) + expectedTeamID="AL798K98FX" + Company="Microsoft" + PatchSkip="YES" + ;; +slack) + name="Slack" + type="dmg" + if [[ $(arch) == "arm64" ]]; then + downloadURL="https://slack.com/ssb/download-osx-silicon" + elif [[ $(arch) == "i386" ]]; then + downloadURL="https://slack.com/ssb/download-osx" + fi + appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*macos\/([0-9.]*)\/.*/\1/g' ) + expectedTeamID="BQR82RBBHL" + ;; +snagit|\ +snagit2021|\ +snagit2020) + name="Snagit 2021" + type="dmg" + downloadURL="https://download.techsmith.com/snagitmac/releases/Snagit.dmg" + expectedTeamID="7TQL462TU8" + ;; +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" + ;; +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 ) + appNewVersion=$(curl -fs https://product-downloads.atlassian.com/software/sourcetree/Appcast/SparkleAppcastAlpha.xml | xpath '//rss/channel/item[last()]/title' 2>/dev/null | sed -n -e 's/^.*Version //p' | sed 's/\<\/title\>//' | sed $'s/[^[:print:]\t]//g') + expectedTeamID="UPXU4CQZ5P" + ;; +spotify) + name="Spotify" + type="dmg" + downloadURL="https://download.scdn.co/Spotify.dmg" + # appNewVersion=$(curl -fs https://www.spotify.com/us/opensource/ | cat | grep -o ".*." | head -1 | cut -d ">" -f2 | cut -d "<" -f1) # does not result in the same version as downloaded + expectedTeamID="2FNC3A47ZF" + ;; +sublimetext) + # credit: Mischa van der Bent (@mischavdbent) + name="Sublime Text" + type="dmg" + downloadURL="https://download.sublimetext.com/latest/stable/osx" + appNewVersion=$(curl -fs https://www.sublimetext.com/3 | grep 'class="latest"' | cut -d '>' -f 4 | sed -E 's/ (.*[0-9]*)<.*/\1/g') + #appNewVersion=$(curl -Is https://download.sublimetext.com/latest/stable/osx | grep "Location:" | sed -n -e 's/^.*Sublime Text //p' | sed 's/.dmg//g' | sed $'s/[^[:print:]\t]//g') # Alternative from @Oh4sh0 + expectedTeamID="Z6D26JE4Y4" + ;; +suspiciouspackage) + # credit: Mischa van der Bent (@mischavdbent) + name="Suspicious Package" + type="dmg" + downloadURL="https://mothersruin.com/software/downloads/SuspiciousPackage.dmg" + addNewVersion=$(curl -fs https://mothersruin.com/software/SuspiciousPackage/get.html | grep 'class="version"' | sed -E 's/.*>([0-9\.]*) \(.*/\1/g') + expectedTeamID="936EB786NH" + ;; +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" + ;; +taskpaper) + # credit: Drew Diver (@grumpydrew on MacAdmins Slack) + name="TaskPaper" + type="dmg" + downloadURL="https://www.taskpaper.com/assets/app/TaskPaper.dmg" + expectedTeamID="64A5CLJP5W" + ;; +teamviewer) + name="TeamViewer" + type="pkgInDmg" + pkgName="Install TeamViewer.pkg" + downloadURL="https://download.teamviewer.com/download/TeamViewer.dmg" + expectedTeamID="H7UGFBUGV6" + ;; +teamviewerhost) + name="TeamViewerHost" + type="pkgInDmg" + packageID="com.teamviewer.teamviewerhost" + downloadURL="https://download.teamviewer.com/download/TeamViewerHost.dmg" + expectedTeamID="H7UGFBUGV6" + #blockingProcessesMaxCPU="5" # Future feature + #Company="TeamViewer GmbH" + ;; +teamviewerqs) + # credit: Søren Theilgaard (@theilgaard) + name="TeamViewerQS" + type="dmg" + downloadURL="https://download.teamviewer.com/download/TeamViewerQS.dmg" + appName="TeamViewerQS.app" + expectedTeamID="H7UGFBUGV6" + ;; +telegram) + name="Telegram" + type="dmg" + downloadURL="https://telegram.org/dl/macos" + appNewVersion=$( curl -fs https://macos.telegram.org | grep anchor | head -1 | sed -E 's/.*a>([0-9.]*) .*/\1/g' ) + expectedTeamID="6N38VWS5BX" + ;; +textmate) + name="TextMate" + type="tbz" + #downloadURL="https://api.textmate.org/downloads/release?os=10.12" + downloadURL=$(downloadURLFromGit "textmate" "textmate") + appNewVersion=$(versionFromGit "textmate" "textmate") + expectedTeamID="45TL96F76G" + ;; +things) + name="Things" + type="zip" + downloadURL="https://culturedcode.com/things/download/" + expectedTeamID="JLMPQHK86H" + ;; +thunderbird) + name="Thunderbird" + type="dmg" + downloadURL="https://download.mozilla.org/?product=thunderbird-latest&os=osx&lang=en-US" + expectedTeamID="43AQ936H96" + blockingProcesses=( thunderbird ) + ;; +tigervnc) + name="TigerVNC Viewer" + type="dmg" + downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/
<' '\n' | awk -F'"' '/x86_64.dmg/ {print $6}' | head -1)
+    #appNewVersion=$( curl -fs https://www.vagrantup.com/downloads.html | grep -i "Current Version" )
+    appNewVersion=$(versionFromGit hashicorp vagrant)
+    expectedTeamID="D38WU7D763"
+    ;;
+vanilla)
+    # credit: Adrian Bühler (@midni9ht)
+    name="Vanilla"
+    type="dmg"
+    downloadURL="https://macrelease.matthewpalmer.net/Vanilla.dmg"
+    expectedTeamID="Z4JV2M65MH"
+    ;;
+virtualbox)
+    # credit: AP Orlebeke (@apizz)
+    name="VirtualBox"
+    type="pkgInDmg"
+    pkgName="VirtualBox.pkg"
+    downloadURL=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" \
+        | awk -F '"' "/OSX.dmg/ { print \$4 }")
+    appNewVersion=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" | awk -F '"' "/OSX.dmg/ { print \$4 }" | sed -E 's/.*virtualbox\/([0-9.]*)\/.*/\1/')
+    expectedTeamID="VB5E2TV963"
+    ;;
+viscosity)
+    #credit: @matins
+    name="Viscosity"
+    type="dmg"
+    downloadURL="https://www.sparklabs.com/downloads/Viscosity.dmg"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*%20([0-9.]*)\..*/\1/g' )
+    expectedTeamID="34XR7GXFPX"
+    ;;
+vlc)
+    name="VLC"
+    type="dmg"
+    if [[ $(arch) == "arm64" ]]; then
+        downloadURL=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2 )
+        appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-arm64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
+    elif [[ $(arch) == "i386" ]]; then
+        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 )
+        appNewVersion=$(curl -fs http://update.videolan.org/vlc/sparkle/vlc-intel64.xml | xpath '//rss/channel/item[last()]/enclosure/@sparkle:version' 2>/dev/null | cut -d '"' -f 2 )
+    fi
+    expectedTeamID="75GAHG3SZQ"
+    ;;
+vmwarehorizonclient)
+    # credit: Oh4sh0 https://github.com/Oh4sh0
+    name="VMware Horizon Client"
+    type="dmg"
+    downloadURL=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3)
+    appNewVersion=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/')
+    expectedTeamID="EG7KH642X6"
+    ;;
+vscodium)
+    # credit: AP Orlebeke (@apizz)
+    name="VSCodium"
+    type="dmg"
+    downloadURL=$(curl -fs "https://api.github.com/repos/VSCodium/vscodium/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }")
+    #downloadURL=$(downloadURLFromGit VSCodium vscodium) # Too many versions
+    appNewVersion=$(versionFromGit VSCodium vscodium)
+    expectedTeamID="C7S3ZQ2B8V"
+    appName="VSCodium.app"
+    blockingProcesses=( Electron )
     ;;
 webexmeetings)
     # credit: Erik Stam (@erikstam)
@@ -1048,981 +2072,11 @@ webexteams)
     downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg"
     expectedTeamID="DE8Y96K9QP"
     ;;
-citrixworkspace)
-    #credit: Erik Stam (@erikstam) and #Philipp on MacAdmins Slack
-    name="Citrix Workspace"
-    type="pkgInDmg"
-    downloadURL="https:"$(curl -s -L "https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html#ctx-dl-eula-external" | grep "dmg?" | sed "s/.*rel=.\(.*\)..id=.*/\1/") # http://downloads.citrix.com/18823/CitrixWorkspaceApp.dmg?__gda__=1605791892_edc6786a90eb5197fb226861a8e27aa8
-    appNewVersion=$(curl -fs https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html | grep "

Version" | head -1 | cut -d " " -f1 | cut -d ";" -f2 | cut -d "." -f 1-3) - expectedTeamID="S272Y5R93J" - ;; -privileges) - # credit: Erik Stam (@erikstam) - name="Privileges" - type="zip" - downloadURL=$(downloadURLFromGit sap macOS-enterprise-privileges ) - appNewVersion=$(versionFromGit sap macOS-enterprise-privileges ) - expectedTeamID="7R5ZEU67FQ" - ;; -icons) - # credit: Mischa van der Bent (@mischavdbent) - name="Icons" - type="zip" - downloadURL=$(downloadURLFromGit sap macOS-icon-generator ) - appNewVersion=$(versionFromGit sap macOS-icon-generator ) - expectedTeamID="7R5ZEU67FQ" - ;; -googledrive|googledrivefilestream) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Google Drive File Stream" - type="pkgInDmg" - packageID="com.google.drivefs" - downloadURL="https://dl.google.com/drive-file-stream/GoogleDriveFileStream.dmg" # downloadURL="https://dl.google.com/drive-file-stream/GoogleDrive.dmg" - blockingProcesses=( "Google Docs" "Google Drive" "Google Sheets" "Google Slides" ) - expectedTeamID="EQHXZ8M8AV" - ;; -plisteditpro) - name="PlistEdit Pro" - type="zip" - downloadURL="https://www.fatcatsoftware.com/plisteditpro/PlistEditPro.zip" - expectedTeamID="8NQ43ND65V" - ;; -slack) - name="Slack" +whatsapp) + name="WhatsApp" type="dmg" - if [[ $(arch) == "arm64" ]]; then - downloadURL="https://slack.com/ssb/download-osx-silicon" - elif [[ $(arch) == "i386" ]]; then - downloadURL="https://slack.com/ssb/download-osx" - fi - appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*macos\/([0-9.]*)\/.*/\1/g' ) - expectedTeamID="BQR82RBBHL" - ;; -sublimetext) - # credit: Mischa van der Bent (@mischavdbent) - name="Sublime Text" - type="dmg" - downloadURL="https://download.sublimetext.com/latest/stable/osx" - appNewVersion=$(curl -fs https://www.sublimetext.com/3 | grep 'class="latest"' | cut -d '>' -f 4 | sed -E 's/ (.*[0-9]*)<.*/\1/g') - #appNewVersion=$(curl -Is https://download.sublimetext.com/latest/stable/osx | grep "Location:" | sed -n -e 's/^.*Sublime Text //p' | sed 's/.dmg//g' | sed $'s/[^[:print:]\t]//g') # Alternative from @Oh4sh0 - expectedTeamID="Z6D26JE4Y4" - ;; -githubdesktop) - name="GitHub Desktop" - type="zip" - downloadURL="https://central.github.com/deployments/desktop/desktop/latest/darwin" - appNewVersion=$(curl -fsL https://central.github.com/deployments/desktop/desktop/changelog.json | awk -F '{' '/"version"/ { print $2 }' | sed -E 's/.*,\"version\":\"([0-9.]*)\".*/\1/g') - 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 }") - appNewVersion=$(curl -sf "https://api.github.com/repos/HandBrake/HandBrake/releases/latest" | awk -F '"' "/tag_name/ { 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) - appNewVersion=$(curl -fs https://ranchero.com/downloads/netnewswire-release.xml | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 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 ) - appNewVersion=$(curl -fs https://version.cyberduck.io/changelog.rss | xpath '//rss/channel/item/enclosure/@sparkle:shortVersionString' 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" - appNewVersion=$(curl -is https://iterm2.com/downloads/stable/latest | grep location: | grep -o "iTerm2.*zip" | cut -d "-" -f 2 | cut -d '.' -f1 | sed 's/_/./g') - 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) - appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 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) - appNewVersion=$(versionFromGit pqrs-org Karabiner-Elements) - expectedTeamID="G43BCU2T37" - ;; -postman) - # credit: Mischa van der Bent - name="Postman" - type="zip" - downloadURL="https://dl.pstmn.io/download/latest/osx" - appNewVersion=$(curl -Ifs https://dl.pstmn.io/download/latest/osx | grep "content-disposition:" | sed -n -e 's/^.*Postman-osx-//p' | sed 's/\.zip//' | sed $'s/[^[:print:]\t]//g' ) - expectedTeamID="H7H8Q7M5CK" - ;; -jamfpppcutility) - # credit: Mischa van der Bent - name="PPPC Utility" - type="zip" - downloadURL=$(downloadURLFromGit jamf PPPC-Utility) - appNewVersion=$(versionFromGit jamf PPPC-Utility) - expectedTeamID="483DWKW443" - ;; -jamfmigrator) - # credit: Mischa van der Bent - name="jamf-migrator" - type="zip" - downloadURL=$(downloadURLFromGit jamf JamfMigrator) - #appNewVersion=$(versionFromGit jamf JamfMigrator) - expectedTeamID="PS2F6S478M" - ;; -jamfreenroller) - # credit: Mischa van der Bent - name="ReEnroller" - type="zip" - downloadURL=$(downloadURLFromGit jamf ReEnroller) - #appNewVersion=$(versionFromGit jamf ReEnroller) - expectedTeamID="PS2F6S478M" - ;; -adobereaderdc|\ -adobereaderdc-install) - name="Adobe Acrobat Reader DC" - type="pkgInDmg" - packageID="com.adobe.acrobat.DC.reader.app.pkg.MUI" - 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) - appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard) - 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) - appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard) - expectedTeamID="JQ525L2MZD" - blockingProcesses=( "AdobeReader" ) - ;; -signal) - # credit: Søren Theilgaard (@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}') - appNewVersion=$(curl -fs https://updates.signal.org/desktop/latest-mac.yml | grep version | awk '{print $2}') - expectedTeamID="U68MSDN6DR" - ;; -docker) - # credit: @securitygeneration - name="Docker" - type="dmg" - downloadURL="https://download.docker.com/mac/stable/Docker.dmg" - appNewVersion=$(curl -ifs https://docs.docker.com/docker-for-mac/release-notes/ | grep ">Docker Desktop Community" | head -1 | sed -n -e 's/^.*Community //p' | cut -d '<' -f1) - expectedTeamID="9BNSXJN65R" - ;; -brave) - # credit: @securitygeneration - name="Brave Browser" - type="dmg" - if [[ $(arch) != "i386" ]]; then - printlog "Architecture: arm64 (not i386)" - downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osxarm64/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n') - else - printlog "Architecture: i386" - downloadURL=$(curl -fsIL https://laptop-updates.brave.com/latest/osx/release | grep -i "^location" | awk '{print $2}' | tr -d '\r\n') - fi -# downloadURL=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) - appNewVersion=$(curl --location --fail --silent "https://updates.bravesoftware.com/sparkle/Brave-Browser/stable/appcast.xml" | xpath '//rss/channel/item[last()]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="KL8N8XSYF4" - ;; -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" -# appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*Fusion-([0-9.]*)-.*/\1/g' ) -# 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) # this label looks like software/site is gone -# 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 | head -1 | cut -d '"' -f 4) - appNewVersion=$(curl -fs https://www.torproject.org/download/ | grep "downloadLink" | grep dmg | head -1 | 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" - appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') - expectedTeamID="VRPY9KHGX6" - ;; -nomadlogin) - # credit: Søren Theilgaard (@theilgaard) - name="NoMAD Login" - type="pkg" - downloadURL="https://files.nomad.menu/NoMAD-Login-AD.pkg" - appNewVersion=$(curl -fs https://nomad.menu/support/ | grep "NoMAD Login AD Downloads" | sed -E 's/.*Current Version ([0-9\.]*)<.*/\1/g') - expectedTeamID="AAPZK3CB24" - ;; -bettertouchtool) - # credit: Søren Theilgaard (@theilgaard) - name="BetterTouchTool" - type="zip" - downloadURL="https://folivora.ai/releases/BetterTouchTool.zip" - appNewVersion=$(curl -fs https://updates.folivora.ai/bettertouchtool_release_notes.html | grep BetterTouchTool | head -n 2 | tail -n 1 | sed -E 's/.* ([0-9\.]*) .*/\1/g') - 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' ) - appNewVersion=$(curl -fsL https://formulae.brew.sh/api/cask/r.json | sed -n 's/^.*"version":"\([^"]*\)".*$/\1/p') - expectedTeamID="VZLD955F6P" - ;; -8x8) - # credit: #D-A-James from MacAdmins Slack and Isaac Ordonez, Mann consulting (@mannconsulting) - name="8x8 Work" - type="dmg" - downloadURL=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}') - # As for appNewVersion, it needs to be checked for newer version than 7.2.4 - appNewVersion=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}' | sed -E 's/.*-v([0-9\.]*)[-\.]*.*/\1/' ) - 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 ) - ;; -camtasia) - name="Camtasia 2020" - type="dmg" - downloadURL=https://download.techsmith.com/camtasiamac/releases/Camtasia.dmg - expectedTeamID="7TQL462TU8" - ;; -snagit|snagit2021|snagit2020) - name="Snagit 2021" - type="dmg" - downloadURL="https://download.techsmith.com/snagitmac/releases/Snagit.dmg" - expectedTeamID="7TQL462TU8" - ;; -virtualbox) - # credit: AP Orlebeke (@apizz) - name="VirtualBox" - type="pkgInDmg" - pkgName="VirtualBox.pkg" - downloadURL=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" \ - | awk -F '"' "/OSX.dmg/ { print \$4 }") - appNewVersion=$(curl -fs "https://www.virtualbox.org/wiki/Downloads" | awk -F '"' "/OSX.dmg/ { print \$4 }" | sed -E 's/.*virtualbox\/([0-9.]*)\/.*/\1/') - expectedTeamID="VB5E2TV963" - ;; -detectxswift) - # credit: AP Orlebeke (@apizz) - name="DetectX Swift" - type="zip" - downloadURL="https://s3.amazonaws.com/sqwarq.com/PublicZips/DetectX_Swift.app.zip" - appNewVersion=$(curl -fs https://s3.amazonaws.com/sqwarq.com/AppCasts/dtxswift_release_notes.html | grep Version | head -1 | sed -E 's/.*Version ([0-9.]*)\<.*/\1/') - expectedTeamID="MAJ5XBJSG3" - ;; -autopkgr) - # credit: Søren Theilgaard (@theilgaard) - name="AutoPkgr" - type="dmg" - #downloadURL=$(curl -fs "https://api.github.com/repos/lindegroup/autopkgr/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") - downloadURL=$(downloadURLFromGit lindegroup autopkgr) - appNewVersion=$(versionFromGit lindegroup autopkgr) - expectedTeamID="JVY2ZR6SEF" - ;; -airserver) - # credit: AP Orlebeke (@apizz) - name="AirServer" - type="dmg" - downloadURL="https://www.airserver.com/download/mac/latest" - #appNewVersion=$() # Cannot find version history or release notes on home page - expectedTeamID="6C755KS5W3" - ;; -vscodium) - # credit: AP Orlebeke (@apizz) - name="VSCodium" - type="dmg" - downloadURL=$(curl -fs "https://api.github.com/repos/VSCodium/vscodium/releases/latest" | awk -F '"' "/browser_download_url/ && /dmg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }") - #downloadURL=$(downloadURLFromGit VSCodium vscodium) # Too many versions - appNewVersion=$(versionFromGit VSCodium vscodium) - expectedTeamID="C7S3ZQ2B8V" - appName="VSCodium.app" - blockingProcesses=( Electron ) - ;; -keepassxc) - # credit: Patrick Atoon (@raptor399) - name="KeePassXC" - type="dmg" - downloadURL="$(downloadURLFromGit keepassxreboot keepassxc)" - appNewVersion=$(versionFromGit keepassxreboot keepassxc) - expectedTeamID="G2S7P7J672" - ;; -alfred) - # credit: AP Orlebeke (@apizz) - name="Alfred" - type="dmg" - downloadURL=$(curl -fs https://www.alfredapp.com | awk -F '"' "/dmg/ {print \$2}" | head -1) - appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*Alfred_([0-9.]*)_.*/\1/') - appName="Alfred 4.app" - expectedTeamID="XZZXE9SED4" - ;; -istatmenus) - # credit: AP Orlebeke (@apizz) - name="iStat Menus" - type="zip" - downloadURL="https://download.bjango.com/istatmenus/" - expectedTeamID="Y93TK974AT" - appNewVersion=$(curl -fs https://bjango.com/mac/istatmenus/versionhistory/ | grep "

" | head -1 | sed -E 's/

([0-9.]*)<\/h3>/\1/') - blockingProcesses=( "iStat Menus" "iStatMenusAgent" "iStat Menus Status" ) - ;; -sizeup) - # credit: AP Orlebeke (@apizz) - name="SizeUp" - type="zip" - downloadURL="https://www.irradiatedsoftware.com/download/SizeUp.zip" - appNewVersion=$(curl -fs https://www.irradiatedsoftware.com/updates/notes/SizeUpReleaseNotes.html | grep Version | sed -E 's/.*Version ([0-9.]*) <.*/\1/') - expectedTeamID="GVZ7RF955D" - ;; -tunnelblick) - name="Tunnelblick" - type="dmg" - downloadURL=$(downloadURLFromGit TunnelBlick Tunnelblick ) - expectedTeamID="Z2SG5H3HC8" - ;; -yubikeymanagerqt) - # credit: Tadayuki Onishi (@kenchan0130) - name="YubiKey Manager GUI" - type="pkg" - downloadURL="https://developers.yubico.com/yubikey-manager-qt/Releases/$(curl -sfL https://api.github.com/repos/Yubico/yubikey-manager-qt/releases/latest | awk -F '"' '/"tag_name"/ { print $4 }')-mac.pkg" - #appNewVersion=$(curl -fs https://developers.yubico.com/yubikey-manager-qt/Releases/ | grep mac.pkg | head -1 | sed -E "s/.*-([0-9.]*)-mac.*/\1/") # does not work - appNewVersion=$(versionFromGit Yubico yubikey-manager-qt) - expectedTeamID="LQA3CS5MM7" - ;; -skitch) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Skitch" - type="zip" - downloadURL=$(curl -fs -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1 Safari/605.1.15" https://evernote.com/products/skitch | grep -o "https://.*zip") - expectedTeamID="J8RPQ294UB" - Company="Evernote" - ;; -dialpad) - # credit: @ehosaka - name="Dialpad" - type="dmg" - downloadURL="https://storage.googleapis.com/dialpad_native/osx/Dialpad.dmg" - expectedTeamID="9V29MQSZ9M" - ;; -amazonworkspaces) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Workspaces" - type="pkg" - downloadURL="https://d2td7dqidlhjx7.cloudfront.net/prod/global/osx/WorkSpaces.pkg" - appNewVersion=$(curl -fs https://d2td7dqidlhjx7.cloudfront.net/prod/iad/osx/WorkSpacesAppCast_macOS_20171023.xml | grep -o "Version*.*<" | head -1 | cut -d " " -f2 | cut -d "<" -f1) - expectedTeamID="94KV3E626L" - ;; -apparency) - name="Apparency" - type="dmg" - downloadURL="https://www.mothersruin.com/software/downloads/Apparency.dmg" - expectedTeamID="936EB786NH" - ;; -bluejeans) - name="BlueJeans" - type="pkg" - downloadURL=$(curl -fs "https://www.bluejeans.com/downloads" | xmllint --html --format - 2>/dev/null | grep -o "https://.*BlueJeansInstaller.dmg" | sed 's/dmg/pkg/g') - appNewVersion=$(echo $downloadURL | cut -d '/' -f6) - expectedTeamID="HE4P42JBGN" - Company="Verizon" - ;; -skype) - name="Skype" - type="dmg" - downloadURL="https://get.skype.com/go/getskype-skypeformac" - appNewVersion=$(curl -is "https://get.skype.com/go/getskype-skypeformac" | grep ocation: | grep -o "Skype-.*dmg" | cut -d "-" -f 2 | cut -d "." -f1-2) - expectedTeamID="AL798K98FX" - Company="Microsoft" - PatchSkip="YES" - ;; -keka) - # credit: Adrian Bühler (@midni9ht) - name="Keka" - type="dmg" - downloadURL=$(downloadURLFromGit aonez Keka) - appNewVersion=$(versionFromGit aonez Keka) - expectedTeamID="4FG648TM2A" - ;; -vmwarehorizonclient) - # credit: Oh4sh0 https://github.com/Oh4sh0 - name="VMware Horizon Client" - type="dmg" - downloadURL=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | grep -o 'Url.*..dmg"' | cut -d '"' -f3) - appNewVersion=$(curl -fs "https://my.vmware.com/channel/public/api/v1.0/dlg/details?locale=en_US&downloadGroup=CART21FQ2_MAC_800&productId=1027&rPId=48989" | sed 's/.*-\(.*\)-.*/\1/') - expectedTeamID="EG7KH642X6" - ;; -adobeconnect) - # credit: Oh4sh0 https://github.com/Oh4sh0 - # Comment by Søren: I do not know this software. - # Looks like it's an Adobe installer in an app, so it will probably not work - name="AdobeConnectInstaller" - type="dmg" - downloadURL="http://www.adobe.com/go/ConnectSetupMac" - appNewVersion=$(curl -fs https://helpx.adobe.com/adobe-connect/connect-downloads-updates.html | grep "Mac" | grep version | head -1 | sed -E 's/.*\(version ([0-9\.]*),.*/\1/g') - expectedTeamID="JQ525L2MZD" - ;; -wireshark) - # credit: Oh4sh0 https://github.com/Oh4sh0 - name="Wireshark" - type="dmg" - downloadURL="https://1.as.dl.wireshark.org/osx/Wireshark%20Latest%20Intel%2064.dmg" - appNewVersion=$(curl -fs https://www.wireshark.org/download.html | grep "Stable Release" | grep -o "(.*.)" | cut -f2 | head -1 | awk -F'[()]' '{print $2}') - expectedTeamID="7Z6EMTD2C6" - ;; -sketch) - name="Sketch" - type="zip" - downloadURL=$(curl -sf https://www.sketch.com/downloads/mac/ | grep 'href="https://download.sketch.com' | sed -E 's/.*href=\"(.*)\".?/\1/g') - appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page - expectedTeamID="WUGMZZ5K46" - ;; -teamviewerqs) - # credit: Søren Theilgaard (@theilgaard) - name="TeamViewerQS" - type="dmg" - downloadURL="https://download.teamviewer.com/download/TeamViewerQS.dmg" - appName="TeamViewerQS.app" - expectedTeamID="H7UGFBUGV6" - ;; -inkscape) - # credit: Søren Theilgaard (@theilgaard) - name="Inkscape" - type="dmg" - downloadURL="https://inkscape.org$(curl -fs https://inkscape.org$(curl -fsJL https://inkscape.org/release/ | grep "/release/" | grep en | head -n 1 | cut -d '"' -f 6)mac-os-x/1010-1015/dl/ | grep "click here" | cut -d '"' -f 2)" - #appNewVersion=$(curl -fsJL https://inkscape.org/release/ | grep "

Inkscape" | cut -d '>' -f 3 | cut -d '<' -f 1 | sed 's/[^0-9.]*//g') # Can't figure out where exact new version is found. Currently returns 1.0, but version is "1.0.0 (4035a4f)" - expectedTeamID="SW3D6BB6A6" - ;; -xink) - name="Xink" - type="zip" - downloadURL="https://downloads.xink.io/macos/client" - #appNewVersion=$() # Cannot find version history or release notes on home page - expectedTeamID="F287823HVS" - ;; - -onlyofficedesktop) - # credit: Adrian Bühler (@midni9ht) - name="ONLYOFFICE" - type="dmg" - downloadURL="https://download.onlyoffice.com/install/desktop/editors/mac/distrib/onlyoffice/ONLYOFFICE.dmg" - expectedTeamID="2WH24U26GJ" - ;; -gpgsuite) - # credit: Micah Lee (@micahflee) - name="GPG Suite" - type="pkgInDmg" - pkgName="Install.pkg" - downloadURL=$(curl -s https://gpgtools.org/ | grep https://releases.gpgtools.org/GPG_Suite- | grep Download | cut -d'"' -f4) - expectedTeamID="PKV8ZPD836" - ;; -gpgsync) - # credit: Micah Lee (@micahflee) - name="GPG Sync" - type="pkg" - downloadURL="https://github.com$(curl -s -L https://github.com/firstlookmedia/gpgsync/releases/latest | grep /firstlookmedia/gpgsync/releases/download | grep \.pkg | cut -d'"' -f2)" - expectedTeamID="P24U45L8P5" - ;; -dangerzone) - # credit: Micah Lee (@micahflee) - name="Dangerzone" - type="dmg" - downloadURL=$(curl -s https://dangerzone.rocks/ | grep https://github.com/firstlookmedia/dangerzone/releases/download | grep \.dmg | cut -d'"' -f2) - expectedTeamID="P24U45L8P5" - ;; -dbeaverce) - # credit: Adrian Bühler (@midni9ht) - name="DBeaver" - type="dmg" - downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg" - expectedTeamID="42B6MDKMW8" - blockingProcesses=( dbeaver ) - ;; -androidfiletransfer) - #credit: Sam Ess (saess-sep) - name="Android File Transfer" - type="dmg" - downloadURL="https://dl.google.com/dl/androidjumper/mtp/current/AndroidFileTransfer.dmg" - expectedTeamID="EQHXZ8M8AV" - ;; -libreoffice) - # credit: Micah Lee (@micahflee) - name="LibreOffice" - type="dmg" - downloadURL="https://download.documentfoundation.org/libreoffice/stable/$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)/mac/x86_64/LibreOffice_$(curl -s https://www.libreoffice.org/download/download/ | grep dl_version_number | head -n 1 | cut -d'>' -f3 | cut -d'<' -f1)_MacOS_x86-64.dmg" - appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)_.*/\1/g' ) - expectedTeamID="7P5S3ZLCN7" - ;; -toggltrack) - # credit: Adrian Bühler (@midni9ht) - name="Toggl Track" - type="dmg" - downloadURL=$(downloadURLFromGit toggl-open-source toggldesktop ) - appNewVersion=$(versionFromGit toggl-open-source toggldesktop ) - expectedTeamID="B227VTMZ94" - ;; -balenaetcher) - # credit: Adrian Bühler (@midni9ht) - name="balenaEtcher" - type="dmg" - downloadURL=$(downloadURLFromGit balena-io etcher ) - appNewVersion=$(versionFromGit balena-io etcher ) - expectedTeamID="66H43P8FRG" - ;; -fsmonitor) - # credit: Adrian Bühler (@midni9ht) - name="FSMonitor" - type="zip" - downloadURL=$(curl --location --fail --silent "https://fsmonitor.com/FSMonitor/Archives/appcast2.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="V85GBYB7B9" - ;; -ramboxce) - # credit: Adrian Bühler (@midni9ht) - name="Rambox" - type="dmg" - downloadURL=$(downloadURLFromGit ramboxapp community-edition ) - appNewVersion=$(versionFromGit ramboxapp community-edition ) - expectedTeamID="7F292FPD69" - ;; -adobebrackets) - # credit: Adrian Bühler (@midni9ht) - name="Brackets" - type="dmg" - downloadURL=$(downloadURLFromGit adobe brackets ) - appNewVersion=$(versionFromGit adobe brackets ) - expectedTeamID="JQ525L2MZD" - ;; -debookee) - # credit: Adrian Bühler (@midni9ht) - name="Debookee" - type="zip" - downloadURL=$(curl --location --fail --silent "https://www.iwaxx.com/debookee/appcast.xml" | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2) - expectedTeamID="AATLWWB4MZ" - ;; -ferdi) - # credit: Adrian Bühler (@midni9ht) - name="Ferdi" - type="dmg" - downloadURL=$(downloadURLFromGit getferdi ferdi ) - appNewVersion=$(versionFromGit getferdi ferdi ) - expectedTeamID="B6J9X9DWFL" - ;; -hyper) - # credit: Adrian Bühler (@midni9ht) - name="Hyper" - type="dmg" - downloadURL=$(downloadURLFromGit vercel hyper ) - appNewVersion=$(versionFromGit vercel hyper) - expectedTeamID="JW6Y669B67" - ;; -menumeters) - # credit: Adrian Bühler (@midni9ht) - name="MenuMeters" - type="zip" - downloadURL=$(downloadURLFromGit yujitach MenuMeters ) - appNewVersion=$(versionFromGit yujitach MenuMeters ) - expectedTeamID="95AQ7YKR5A" - ;; -webexteams) - # credit: Erik Stam (@erikstam) - name="Webex" - type="dmg" - downloadURL="https://binaries.webex.com/WebexTeamsDesktop-MACOS-Gold/WebexTeams.dmg" - #appNewVersion=$() # Cannot find version history or release notes on home page - expectedTeamID="DE8Y96K9QP" - ;; -mattermost) - name="Mattermost" - type="dmg" - downloadURL=$(downloadURLFromGit mattermost desktop) - appNewVersion=$(versionFromGit mattermost desktop ) - expectedTeamID="UQ8HT4Q2XM" - ;; -bitwarden) - name="Bitwarden" - type="dmg" - downloadURL=$(downloadURLFromGit bitwarden desktop ) - appNewVersion=$(versionFromGit bitwarden desktop ) - expectedTeamID="LTZ2PFU5D6" - ;; -thunderbird) - name="Thunderbird" - type="dmg" - downloadURL="https://download.mozilla.org/?product=thunderbird-latest&os=osx&lang=en-US" - expectedTeamID="43AQ936H96" - blockingProcesses=( thunderbird ) - ;; -tigervnc) - name="TigerVNC Viewer" - type="dmg" - downloadURL=https://dl.bintray.com/tigervnc/stable/$(curl -s -l https://dl.bintray.com/tigervnc/stable/ | grep .dmg | sed 's/
)" | head -1 | cut -d "(" -f2 | sed 's/\<\/span\>//g' | cut -d "<" -f1)
-    ;;
-jabradirect)
-    name="Jabra Direct"
-    type="dmg"
-    downloadURL="https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg"
-    expectedTeamID="55LV32M29R"
-    appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
-    ;;
-vagrant)
-    # credit: AP Orlebeke (@apizz)
-    name="Vagrant"
-    type="pkgInDmg"
-    pkgName="vagrant.pkg"
-    downloadURL=$(curl -fs https://www.vagrantup.com/downloads | tr '><' '\n' | awk -F'"' '/x86_64.dmg/ {print $6}' | head -1)
-    #appNewVersion=$( curl -fs https://www.vagrantup.com/downloads.html | grep -i "Current Version" )
-    appNewVersion=$(versionFromGit hashicorp vagrant)
-    expectedTeamID="D38WU7D763"
-    ;;
-aircall)
-    # credit: @kris-anderson
-    name="Aircall"
-    type="dmg"
-    downloadURL="https://electron.aircall.io/download/osx"
-    expectedTeamID="3ML357Q795"
-    ;;
-installomator_st)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Installomator"
-    type="pkg"
-    packageID="dk.theilgaard.pkg.Installomator"
-    downloadURL=$(downloadURLFromGit theile Installomator )
-    appNewVersion=$(versionFromGit theile Installomator )
-    expectedTeamID="L8W73B6AH3"
-    blockingProcesses=( NONE )
-    ;;
-etrecheck)
-    # credit: @dvsjr macadmins slack
-    name="EtreCheckPro"
-    type="zip"
-    downloadURL="https://cdn.etrecheck.com/EtreCheckPro.zip"
-    expectedTeamID="U87NE528LC"
-    ;;
-hazel)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Hazel"
-    type="dmg"
-    downloadURL=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')
-    appNewVersion=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g')
-    expectedTeamID="86Z3GCJ4MF"
-    ;;
-cormorant)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Cormorant"
-    type="zip"
-    downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g')
-    appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "$name [0-9.]*" | awk '{print $2}')
-    expectedTeamID="QWY4LRW926"
-    ;;
-silnite)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="silnite"
-    type="pkgInZip"
-    downloadURL=$(curl -fs https://eclecticlight.co/downloads/ | grep -i $name | grep zip | sed -E 's/.*href=\"(https.*)\">.*/\1/g')
-    appNewVersion=$(curl -fs https://eclecticlight.co/downloads/ | grep zip | grep -o -E "silnite [0-9.]*" | awk '{print $2}')
-    expectedTeamID="QWY4LRW926"
-    blockingProcesses=( NONE )
-    ;;
-devonthink)
-    # It's a zipped dmg file, needs function installAppInDmgInZip
-    # credit: Søren Theilgaard (@theilgaard)
-    name="DEVONthink 3"
-    type="appInDmgInZip"
-    downloadURL=$( curl -fs https://www.devontechnologies.com/apps/devonthink | grep -i "download.devon" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' )
-    appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 )
-    expectedTeamID="679S2QUWR8"
-    ;;
-vanilla)
-    # credit: Adrian Bühler (@midni9ht)
-    name="Vanilla"
-    type="dmg"
-    downloadURL="https://macrelease.matthewpalmer.net/Vanilla.dmg"
-    expectedTeamID="Z4JV2M65MH"
-    ;;
-taskpaper)
-    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
-    name="TaskPaper"
-    type="dmg"
-    downloadURL="https://www.taskpaper.com/assets/app/TaskPaper.dmg"
-    expectedTeamID="64A5CLJP5W"
-    ;;
-calibre)
-    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
-    name="calibre"
-    type="dmg"
-    downloadURL="https://calibre-ebook.com/dist/osx"
-    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
-    expectedTeamID="NTY7FVCEKP"
-    ;;
-redeye)
-    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
-    name="Red Eye"
-    type="zip"
-    downloadURL="https://www.hexedbits.com/downloads/redeye.zip"
-    appNewVersion=$( curl -fs "https://www.hexedbits.com/redeye/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' )
-    expectedTeamID="5VRJU68BZ5"
-    ;;
-lucifer)
-    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
-    name="Lucifer"
-    type="zip"
-    downloadURL="https://www.hexedbits.com/downloads/lucifer.zip"
-    appNewVersion=$( curl -fs "https://www.hexedbits.com/lucifer/" | grep "Latest version" | sed -E 's/.*Latest version ([0-9.]*),.*/\1/g' )
-    expectedTeamID="5VRJU68BZ5"
-    ;;
-fantastical)
-    # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
-    name="Fantastical"
-    type="zip"
-    downloadURL="https://flexibits.com/fantastical/download"
-    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
-    expectedTeamID="85C27NK92C"
-    ;;
-launchbar)
-    name="LaunchBar"
-    type="dmg"
-    downloadURL=$(curl -fs "https://obdev.at/products/launchbar/download.html" | xmllint --html --format - 2>/dev/null | grep -m 1 -o "https://.*.dmg")
-    appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
-    expectedTeamID="MLZF7K7B5R"
-    ;;
-klokki)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Klokki"
-    type="dmg"
-    downloadURL="https://storage.yandexcloud.net/klokki/Klokki.dmg"
-    expectedTeamID="Q9SATZMHPG"
-    ;;
-notion)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Notion"
-    type="dmg"
-    if [[ $(arch) == "arm64" ]]; then
-        downloadURL="https://www.notion.so/desktop/apple-silicon/download"
-    elif [[ $(arch) == "i386" ]]; then
-        downloadURL="https://www.notion.so/desktop/mac/download"
-    fi
-    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
-    expectedTeamID="LBQJ96FQ8D"
-    ;;
-lexarrecoverytool)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Lexar Recovery Tool"
-    type="appInDmgInZip"
-    downloadURL="https://www.lexar.com$( curl -fs https://www.lexar.com/support/downloads/ | grep -i "mac" | grep -i "recovery" | head -1 | tr '"' '\n' | grep -i ".zip"  )"
-    #appNewVersion=""
-    expectedTeamID="Y8HM6WR2DV"
-    ;;
-easeusdatarecoverywizard)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="EaseUS Data Recovery Wizard"
-    type="dmg"
-    downloadURL=$( curl -fsIL https://down.easeus.com/product/mac_drw_free_setup | grep -i "^location" | awk '{print $2}' | tr -d '\r\n' )
-    #appNewVersion=""
-    expectedTeamID="DLLVW95FSM"
-    ;;
-lastpass)
-    name="LastPass"
-    type="dmg"
-    downloadURL="https://download.cloud.lastpass.com/mac/LastPass.dmg"
-    expectedTeamID="N24REP3BMN"
-    Company="Marvasol, Inc DBA LastPass"
-    ;;
-front)
-    name="Front"
-    type="dmg"
-    downloadURL="https://dl.frontapp.com/macos/Front.dmg"
-    expectedTeamID="X549L7572J"
-    Company="FrontApp. Inc."
-    ;;
-telegram)
-    name="Telegram"
-    type="dmg"
-    downloadURL="https://telegram.org/dl/macos"
-    appNewVersion=$( curl -fs https://macos.telegram.org | grep anchor | head -1 | sed -E 's/.*a>([0-9.]*) .*/\1/g' )
-    expectedTeamID="6N38VWS5BX"
-    ;;
-obsidian)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Obsidian"
-    type="dmg"
-    if [[ $(arch) == "arm64" ]]; then
-        downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep "arm64" )
-    elif [[ $(arch) == "i386" ]]; then
-        downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep -v "arm64" )
-    fi
-    appNewVersion=$(versionFromGit obsidianmd obsidian-releases)
-    expectedTeamID="6JSW4SJWN9"
+    downloadURL="https://web.whatsapp.com/desktop/mac/files/WhatsApp.dmg"
+    expectedTeamID="57T9237FN3"
     ;;
 wickrme)
     # credit: Søren Theilgaard (@theilgaard)
@@ -2040,131 +2094,139 @@ wickrpro)
     appNewVersion=$( echo ${downloadURL} | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
     expectedTeamID="W8RC3R952A"
     ;;
-exelbanstats)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Stats"
+wireshark)
+    # credit: Oh4sh0 https://github.com/Oh4sh0
+    name="Wireshark"
     type="dmg"
-    downloadURL=$(downloadURLFromGit exelban stats)
-    appNewVersion=$(versionFromGit exelban stats)
-    expectedTeamID="RP2S87B72W"
+    downloadURL="https://1.as.dl.wireshark.org/osx/Wireshark%20Latest%20Intel%2064.dmg"
+    appNewVersion=$(curl -fs https://www.wireshark.org/download.html | grep "Stable Release" | grep -o "(.*.)" | cut -f2 | head -1 | awk -F'[()]' '{print $2}')
+    expectedTeamID="7Z6EMTD2C6"
     ;;
-onionshare)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="OnionShare"
+xink)
+    name="Xink"
+    type="zip"
+    downloadURL="https://downloads.xink.io/macos/client"
+    #appNewVersion=$() # Cannot find version history or release notes on home page
+    expectedTeamID="F287823HVS"
+    ;;
+yubikeymanagerqt)
+    # credit: Tadayuki Onishi (@kenchan0130)
+    name="YubiKey Manager GUI"
     type="pkg"
-    downloadURL="https://onionshare.org$(curl -fs https://onionshare.org | grep "button.*pkg" | tr '"' '\n' | grep ".pkg")"
-    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
-    expectedTeamID="N9B95FDWH4"
+    downloadURL="https://developers.yubico.com/yubikey-manager-qt/Releases/$(curl -sfL https://api.github.com/repos/Yubico/yubikey-manager-qt/releases/latest | awk -F '"' '/"tag_name"/ { print $4 }')-mac.pkg"
+    #appNewVersion=$(curl -fs https://developers.yubico.com/yubikey-manager-qt/Releases/ | grep mac.pkg | head -1 | sed -E "s/.*-([0-9.]*)-mac.*/\1/") # does not work
+    appNewVersion=$(versionFromGit Yubico yubikey-manager-qt)
+    expectedTeamID="LQA3CS5MM7"
     ;;
-keyboardmaestro)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="Keyboard Maestro"
-    type="zip"
-    downloadURL="https://download.keyboardmaestro.com/"
-    #appNewVersion=$( curl -fs https://www.stairways.com/press/ | grep -i "releases Keyboard Maestro" | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # Text based from web site
-    appNewVersion=$( curl -fs "https://www.stairways.com/press/rss.xml" | xpath '//rss/channel/item/title[contains(text(), "releases Keyboard Maestro")]' 2>/dev/null | head -1 | sed -E 's/.*releases Keyboard Maestro ([0-9.]*)<.*/\1/g' ) # uses XML, so might be a little more precise/future proof
-    expectedTeamID="QMHRBA4LGH"
-    blockingProcesses=( "Keyboard Maestro Engine" "Keyboard Maestro" )
-    ;;
-loom)
-    # credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
-    name="Loom"
-    type="dmg"
-    downloadURL=https://cdn.loom.com/desktop-packages/$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/url/ && /dmg/ {print $3}' | head -1)
-    appNewVersion=$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/version/ {print $2}' )
-    expectedTeamID="QGD2ZPXZZG"
-    ;;
-golang)
-    # credit: Søren Theilgaard (@theilgaard)
-    name="GoLang"
+zoom)
+    # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
+    name="Zoom.us"
     type="pkg"
-    packageID="org.golang.go"
-    downloadURL="$(curl -fsIL "https://golang.org$(curl -fs "https://golang.org/dl/" | grep -i "downloadBox" | grep "pkg" | tr '"' '\n' | grep "pkg")" | grep -i "^location" | awk '{print $2}' | tr -d '\r\n')"
-    appNewVersion="$( echo "${downloadURL}" | sed -E 's/.*\/(go[0-9.]*)\..*/\1/g' )" # Version includes letters "go"
-    expectedTeamID="EQHXZ8M8AV"
-    blockingProcesses=( NONE )
-    ;;
-rectangle)
-    name="Rectangle"
-    type="dmg"
-    downloadURL=$(downloadURLFromGit rxhanson Rectangle)
-    appNewVersion=$(versionFromGit rxhanson Rectangle)
-    expectedTeamID="XSYZ3E4B7D"
-    ;;
-knockknock)
-    name="KnockKnock"
-    type="zip"
-    downloadURL=$( curl -fs "https://objective-see.com/products/knockknock.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
-    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
-    expectedTeamID="VBG97UB4TA"
-    ;;
-lulu)
-    name="LuLu"
-    type="dmg"
-    downloadURL=$( curl -fs "https://objective-see.com/products/lulu.html" | grep https | grep "$type" | head -1 | tr '"' "\n" | grep "^http" )
-    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*_([0-9.]*)\..*/\1/g' )
-    expectedTeamID="VBG97UB4TA"
-    ;;
-element)
-    # credit: Adrian Bühler (@midni9ht)
-    name="Element"
-    type="dmg"
-    downloadURL="https://packages.riot.im/desktop/install/macos/Element.dmg"
-    expectedTeamID="7J4U792NQT"
-    ;;
-teamviewerhost)
-    name="TeamViewerHost"
-    type="pkgInDmg"
-    packageID="com.teamviewer.teamviewerhost"
-    downloadURL="https://download.teamviewer.com/download/TeamViewerHost.dmg"
-    expectedTeamID="H7UGFBUGV6"
-    #blockingProcessesMaxCPU="5" # Future feature
-    #Company="TeamViewer GmbH"
-    ;;
-amazonchime)
-    # credit: @dvsjr macadmins slack
-    name="Amazon Chime"
-    type="dmg"
-    downloadURL="https://clients.chime.aws/mac/latest"
-    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*-([0-9.]*)\..*/\1/g' )
-    expectedTeamID="94KV3E626L"
-    #Company="Amazon"
-    ;;
-basecamp3)
-    #credit: @matins
-    name="Basecamp 3"
-    type="dmg"
-    downloadURL="https://bc3-desktop.s3.amazonaws.com/mac/basecamp3.dmg"
-    expectedTeamID="2WNYUYRS7G"
-    appName="Basecamp 3.app"
-    ;;
-proctortrack)
-    #credit: Jeff F. (@jefff on MacAdmins Slack)
-    name="Proctortrack"
-    type="zip"
-    downloadURL="https://storage.googleapis.com/verificientstatic/ProctortrackApp/Production/Proctortrack.zip"
-    expectedTeamID="SNHZD6TJE6"
-    #Company="Verificient Technologies"
-    ;;
-viscosity)
-    #credit: @matins
-    name="Viscosity"
-    type="dmg"
-    downloadURL="https://www.sparklabs.com/downloads/Viscosity.dmg"
-    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*%20([0-9.]*)\..*/\1/g' )
-    expectedTeamID="34XR7GXFPX"
+    downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg"
+    appNewVersion=$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" "https://zoom.us/download" | grep Version | head -n 1 | sed -E 's/.* ([0-9.]* \(.*\)).*/\1/') # credit: Søren Theilgaard (@theilgaard)
+    expectedTeamID="BJ4HAAB9B3"
+    blockingProcesses=( zoom.us )
     ;;
 
+
 # MARK: add new labels above here
 
-# NOTE: Packages is signed but _not_ notarized, so spctl will reject it
+#cdef)
+#    # cdef currently not signed
+#    # credit: Søren Theilgaard (@theilgaard)
+#    name="cdef"
+#    type="pkg"
+#    downloadURL=$(downloadURLFromGit Shufflepuck cdef)
+#    appNewVersion=$(versionFromGit Shufflepuck cdef)
+#    #expectedTeamID="EM3ER8T33A"
+#    ;;
+#fontforge)
+#    # FontForge Not signed
+#    # credit: Søren Theilgaard (@theilgaard)
+#    name="FontForge"
+#    type="dmg"
+#    downloadURL=$(downloadURLFromGit fontforge fontforge)
+#    appNewVersion=$(versionFromGit fontforge fontforge)
+#    expectedTeamID=""
+#    ;;
+#notifier)
+#    # not signed
+#    # credit: Søren Theilgaard (@theilgaard)
+#    name="dataJAR Notifier"
+#    type="pkg"
+#    #packageID="uk.co.dataJAR.Notifier" # Version 2.2.3 was actually "uk.co.dataJAR.Notifier-2.2.3" so unusable
+#    downloadURL=$(downloadURLFromGit dataJAR Notifier)
+#    appNewVersion=$(versionFromGit dataJAR Notifier)
+#    expectedTeamID=""
+#    blockingProcesses=( "Notifier" )
+#    ;;
 # packages)
+# NOTE: Packages is signed but _not_ notarized, so spctl will reject it
 #    name="Packages"
 #    type="pkgInDmg"
 #    pkgName="Install Packages.pkg"
 #    downloadURL="http://s.sudre.free.fr/Software/files/Packages.dmg"
 #    expectedTeamID="NL5M9E394P"
 #    ;;
+# powershell)
+# NOTE: powershell installers are not notarized
+#     # 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)
+# NOTE: powershell installers are not notarized
+#     # 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"
+#     ;;
+#shield)
+#    # credit: Søren Theilgaard (@theilgaard)
+#    # 2021-01-13 Currently Pre-release and we cant get latest version
+#    name="Shield"
+#    type="zip"
+#    downloadURL=$(downloadURLFromGit theevilbit Shield)
+#    appNewVersion=$(versionFromGit theevilbit Shield)
+#    expectedTeamID="33YRLYRBYV"
+#    ;;
+# vmwarefusion)
+# TODO: vmwarefusion installation process needs testing
+#     # credit: Erik Stam (@erikstam)
+#     name="VMware Fusion"
+#     type="dmg"
+#     downloadURL="https://www.vmware.com/go/getfusion"
+#     appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*Fusion-([0-9.]*)-.*/\1/g' )
+#     expectedTeamID="EG7KH642X6"
+#     ;;
+#wordmat)
+#    # WordMat currently not signed
+#    # credit: Søren Theilgaard (@theilgaard)
+#    name="WordMat"
+#    type="pkg"
+#    packageID="com.eduap.pkg.WordMat"
+#    downloadURL=$(downloadURLFromGit Eduap-com WordMat)
+#    #downloadURL=$(curl -fs "https://api.github.com/repos/Eduap-com/WordMat/releases/latest" | awk -F '"' "/browser_download_url/ && /pkg/ && ! /sig/ && ! /CLI/ && ! /sha256/ { print \$4 }")
+#    appNewVersion=$(versionFromGit Eduap-com WordMat)
+#    #curl -fs "https://api.github.com/repos/Eduap-com/WordMat/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g'
+#    expectedTeamID=""
+#    ;;
+
+#wwdcformac)
+#    this label looks like software/site is gone
+#    name="WWDC"
+#    type="zip"
+#    downloadURL="https://cdn.wwdc.io/WWDC_latest.zip"
+#    expectedTeamID="8C7439RJLG"
+#    ;;
+
+
+# MARK: Microsoft
 
 # msupdate codes from:
 # https://docs.microsoft.com/en-us/deployoffice/mac/update-office-for-mac-using-msupdate
@@ -2380,7 +2442,6 @@ valuesfromarguments)
     fi
     ;;
 
-
 # these descriptions exist for testing and are intentionally broken
 brokendownloadurl)
     name="Google Chrome"

From 602db7279a3d3e365714ab8746005290e23b31d1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Mon, 15 Feb 2021 21:49:52 +0100
Subject: [PATCH 03/17] Update Installomator.sh

---
 Installomator.sh | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index eb2bea0..b9cb140 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -724,11 +724,7 @@ version)
     ;;
 longversion)
     # print the script version
-    printlog "Installomator location:"
-    printlog "${SELFLOCATION}/${SELF}"
-    printlog "Labels file:"
-    printlog "$labelFile"
-    printlog "Version $VERSION ($VERSIONDATE), branch $VERSIONBRANCH, Labels file version $labelsVERSION"
+    printlog "Installomater: version $VERSION ($VERSIONDATE)"
     exit 0
     ;;
 

From 0c5231786a17455300bea55ac0e77886cb2c74ca Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Wed, 17 Feb 2021 22:24:24 +0100
Subject: [PATCH 04/17] Update Installomator.sh

---
 Installomator.sh | 254 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 244 insertions(+), 10 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index faea67c..7249678 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -735,6 +735,9 @@ longversion)
     downloadURL="https://app-updates.agilebits.com/download/OPM7"
     appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[0-9a-zA-Z]*-([0-9.]*)\..*/\1/g' )
     expectedTeamID="2BUA8C4S2C"
+    blockingProcesses=( "1Password Extension Helper" "1Password 7" )
+    forcefulQuit=YES
+    #Company="Agilebits"
     ;;
 8x8)
     # credit: #D-A-James from MacAdmins Slack and Isaac Ordonez, Mann consulting (@mannconsulting)
@@ -744,6 +747,15 @@ longversion)
     # As for appNewVersion, it needs to be checked for newer version than 7.2.4
     appNewVersion=$(curl -fs -L https://support.8x8.com/cloud-phone-service/voice/work-desktop/download-8x8-work-for-desktop | grep -m 1 -o "https.*dmg" | sed 's/\"//' | awk '{print $1}' | sed -E 's/.*-v([0-9\.]*)[-\.]*.*/\1/' )
     expectedTeamID="FC967L3QRG"
+    #Company="8x8"
+    ;;
+abstract)
+    name="Abstract"
+    type="zip"
+    downloadURL="https://api.goabstract.com/releases/latest/download"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="77MZLZE47D"
+    #Company="Elastic Projects, Inc"
     ;;
 adobebrackets)
     # credit: Adrian Bühler (@midni9ht)
@@ -769,15 +781,20 @@ adobereaderdc-install)
     type="pkgInDmg"
     packageID="com.adobe.acrobat.DC.reader.app.pkg.MUI"
     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)
-    appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
+    appNewVersion=$(curl -s https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt)
+    #appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
     expectedTeamID="JQ525L2MZD"
     blockingProcesses=( "AdobeReader" )
+    #Company="Adobe"
+    #PatchName="AcrobatReader"
+    #PatchSkip="YES"
     ;;
 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)
-    appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
+    appNewVersion=$(curl -s https://armmf.adobe.com/arm-manifests/mac/AcrobatDC/reader/current_version.txt)
+    #appNewVersion=$(curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15)" https://get.adobe.com/reader/ | grep ">Version" | sed -E 's/.*Version 20([0-9.]*)<.*/\1/g') # credit: Søren Theilgaard (@theilgaard)
     expectedTeamID="JQ525L2MZD"
     blockingProcesses=( "AdobeReader" )
     ;;
@@ -795,6 +812,7 @@ airserver)
     downloadURL="https://www.airserver.com/download/mac/latest"
     #appNewVersion=$() # Cannot find version history or release notes on home page
     expectedTeamID="6C755KS5W3"
+    #Company="App Dynamic ehf"
     ;;
 alfred)
     # credit: AP Orlebeke (@apizz)
@@ -804,6 +822,7 @@ alfred)
     appNewVersion=$(echo "${downloadURL}" | sed -E 's/.*Alfred_([0-9.]*)_.*/\1/')
     appName="Alfred 4.app"
     expectedTeamID="XZZXE9SED4"
+    #Company="Running with Crayons Ltd"
     ;;
 amazonchime)
     # credit: @dvsjr macadmins slack
@@ -834,6 +853,7 @@ apparency)
     type="dmg"
     downloadURL="https://www.mothersruin.com/software/downloads/Apparency.dmg"
     expectedTeamID="936EB786NH"
+    #Company="Mother's Ruin Graphics"
     ;;
 appcleaner)
     # credit: Tadayuki Onishi (@kenchan0130)
@@ -841,6 +861,7 @@ 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"
+    #Company=FreeMacSoft
     ;;
 aquaskk)
     # credit: Tadayuki Onishi (@kenchan0130)
@@ -849,6 +870,8 @@ aquaskk)
     downloadURL=$(downloadURLFromGit codefirst aquaskk)
     appNewVersion=$(versionFromGit codefirst aquaskk)
     expectedTeamID="FPZK4WRGW7"
+    #Company="Code First"
+    #PatchSkip="YES"
     ;;
 atom)
     name="Atom"
@@ -857,6 +880,7 @@ atom)
     downloadURL=$(downloadURLFromGit atom atom )
     appNewVersion=$(versionFromGit atom atom)
     expectedTeamID="VEKTX9H2N7"
+    #Company=GitHub
     ;;
 autodmg)
     # credit: Mischa van der Bent (@mischavdbent)
@@ -865,6 +889,7 @@ autodmg)
     downloadURL=$(downloadURLFromGit MagerValp AutoDMG)
     appNewVersion=$(versionFromGit MagerValp AutoDMG)
     expectedTeamID="5KQ3D3FG5H"
+    #Company=MagerValp
     ;;
 autopkgr)
     # credit: Søren Theilgaard (@theilgaard)
@@ -874,6 +899,7 @@ autopkgr)
     downloadURL=$(downloadURLFromGit lindegroup autopkgr)
     appNewVersion=$(versionFromGit lindegroup autopkgr)
     expectedTeamID="JVY2ZR6SEF"
+    #Company="Linde Group"
     ;;
 aviatrix)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
@@ -881,6 +907,15 @@ aviatrix)
     type="pkg"
     downloadURL="https://s3-us-west-2.amazonaws.com/aviatrix-download/AviatrixVPNClient/AVPNC_mac.pkg"
     expectedTeamID="32953Z7NBN"
+    #Company=Aviatrix
+    ;;
+awsvpnclient)
+    name="AWS VPN Client"
+    type="pkg"
+    downloadURL="https://d20adtppz83p9s.cloudfront.net/OSX/latest/AWS_VPN_Client.pkg"
+    expectedTeamID="94KV3E626L"
+    appNewVersion=$(curl -is "https://beta2.communitypatch.com/jamf/v1/ba1efae22ae74a9eb4e915c31fef5dd2/patch/AWSVPNClient" | grep currentVersion | tr ',' '\n' | grep currentVersion | cut -d '"' -f 4)
+    #Company=Amazon
     ;;
 balenaetcher)
     # credit: Adrian Bühler (@midni9ht)
@@ -889,6 +924,7 @@ balenaetcher)
     downloadURL=$(downloadURLFromGit balena-io etcher )
     appNewVersion=$(versionFromGit balena-io etcher )
     expectedTeamID="66H43P8FRG"
+    #Company="Balena"
     ;;
 basecamp3)
     #credit: @matins
@@ -904,6 +940,7 @@ bbedit)
     downloadURL=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort | tail -n1 | cut -d">" -f2 | cut -d"<" -f1)
     appNewVersion=$(curl -s https://versioncheck.barebones.com/BBEdit.xml | grep dmg | sort  | tail -n1 | sed -E 's/.*BBEdit_([0-9 .]*)\.dmg.*/\1/')
     expectedTeamID="W52GZAXT98"
+    #Company="Bare Bones Software"
     ;;
 bettertouchtool)
     # credit: Søren Theilgaard (@theilgaard)
@@ -926,7 +963,7 @@ bluejeans)
     downloadURL=$(curl -fs "https://www.bluejeans.com/downloads" | xmllint --html --format - 2>/dev/null | grep -o "https://.*BlueJeansInstaller.dmg" | sed 's/dmg/pkg/g')
     appNewVersion=$(echo $downloadURL | cut -d '/' -f6)
     expectedTeamID="HE4P42JBGN"
-    Company="Verizon"
+    #Company="Verizon"
     ;;
 boxdrive)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
@@ -1152,6 +1189,13 @@ ferdi)
     appNewVersion=$(versionFromGit getferdi ferdi )
     expectedTeamID="B6J9X9DWFL"
     ;;
+figma)
+    name="Figma"
+    type="zip"
+    downloadURL="https://www.figma.com/download/desktop/mac/"
+    expectedTeamID="T8RA8NE3B7"
+    #Company="Figma"
+    ;;
 firefox)
     name="Firefox"
     type="dmg"
@@ -1168,6 +1212,7 @@ firefox_da)
     expectedTeamID="43AQ936H96"
     blockingProcesses=( firefox )
     ;;
+firefoxesr|\
 firefoxesrpkg)
     name="Firefox"
     type="pkg"
@@ -1196,6 +1241,14 @@ fsmonitor)
     downloadURL=$(curl --location --fail --silent "https://fsmonitor.com/FSMonitor/Archives/appcast2.xml" | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null  | cut -d '"' -f 2)
     expectedTeamID="V85GBYB7B9"
     ;;
+gimp)
+    name="GIMP"
+    type="dmg"
+    downloadURL=https://$(curl -fs https://www.gimp.org/downloads/ | grep -m 1 -o "download.*gimp-.*.dmg")
+    appNewVersion=$(echo $downloadURL | cut -d "-" -f 2)
+    expectedTeamID="T25BQ8HSJF"
+    #Company="GIMP"
+    ;;
 githubdesktop)
     name="GitHub Desktop"
     type="zip"
@@ -1240,6 +1293,13 @@ googlechromepkg)
     updateToolArguments=( -runMode oneshot -userInitiated YES )
     updateToolRunAsCurrentUser=1
     ;;
+googleearth)
+    name="Google Earth Pro"
+    type="pkgInDmg"
+    downloadURL="https://dl.google.com/earth/client/advanced/current/GoogleEarthProMac-Intel.dmg"
+    expectedTeamID="EQHXZ8M8AV"
+    #Company="Google"
+    ;;
 googledrive|\
 googledrivefilestream)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
@@ -1250,6 +1310,14 @@ googledrivefilestream)
     blockingProcesses=( "Google Docs" "Google Drive" "Google Sheets" "Google Slides" )
     expectedTeamID="EQHXZ8M8AV"
     ;;
+googledrivebackupandsync)
+    name="Backup and Sync"
+    type="dmg"
+    downloadURL="https://dl.google.com/drive/InstallBackupAndSync.dmg"
+    expectedTeamID="EQHXZ8M8AV"
+    #Company="Google"
+    #PatchSkip="YES"
+    ;;
 googlejapaneseinput)
     # credit: Tadayuki Onishi (@kenchan0130)
     name="GoogleJapaneseInput"
@@ -1329,6 +1397,13 @@ installomator_st)
     expectedTeamID="L8W73B6AH3"
     blockingProcesses=( NONE )
     ;;
+intellijideace)
+    name="IntelliJ IDEA CE"
+    type="dmg"
+    downloadURL="https://download.jetbrains.com/product?code=IIC&latest&distribution=mac"
+    expectedTeamID="2ZEFAR8TH3"
+    #Company="JetBrains"
+    ;;
 istatmenus)
     # credit: AP Orlebeke (@apizz)
     name="iStat Menus"
@@ -1353,6 +1428,15 @@ jabradirect)
     expectedTeamID="55LV32M29R"
     appNewVersion=$(curl -fs https://www.jabra.com/Support/release-notes/release-note-jabra-direct | grep -o "Jabra Direct macOS:*.*<" | head -1 | cut -d ":" -f2 | cut -d " " -f2 | cut -d "<" -f1)
     ;;
+jamfconnect)
+    name="Jamf Connect"
+    type="pkgInDmg"
+    packageID="com.jamf.connect"
+    downloadURL="https://files.jamfconnect.com/JamfConnect.dmg"
+    expectedTeamID="483DWKW443"
+    #Company="Jamf"
+    #PatchSkip="YES"
+    ;;
 jamfmigrator)
     # credit: Mischa van der Bent
     name="jamf-migrator"
@@ -1507,6 +1591,14 @@ menumeters)
     appNewVersion=$(versionFromGit yujitach MenuMeters )
     expectedTeamID="95AQ7YKR5A"
     ;;
+musescore)
+    name="MuseScore 3"
+    type="dmg"
+    downloadURL=$(downloadURLFromGit musescore MuseScore)
+    appNewVersion=$(versionFromGit musescore MuseScore)
+    expectedTeamID="6EPAF2X3PR"
+    #Company="Musescore"
+    ;;
 netnewswire)
     name="NetNewsWire"
     type="zip"
@@ -1667,6 +1759,13 @@ postman)
     appNewVersion=$(curl -Ifs https://dl.pstmn.io/download/latest/osx | grep "content-disposition:" | sed -n -e 's/^.*Postman-osx-//p' | sed 's/\.zip//' | sed $'s/[^[:print:]\t]//g' )
     expectedTeamID="H7H8Q7M5CK"
     ;;
+prism9)
+    name="Prism 9"
+    type="dmg"
+    downloadURL="https://cdn.graphpad.com/downloads/prism/9/InstallPrism9.dmg"
+    expectedTeamID="YQ2D36NS9M"
+    Company="GraphPad Software"
+    ;;
 privileges)
     # credit: Erik Stam (@erikstam)
     name="Privileges"
@@ -1683,6 +1782,28 @@ proctortrack)
     expectedTeamID="SNHZD6TJE6"
     #Company="Verificient Technologies"
     ;;
+promiseutilityr)
+    name="Promise Utility"
+    type="pkgInDmg"
+    packageID="com.promise.utilinstaller"
+    downloadURL="https://www.promise.com/DownloadFile.aspx?DownloadFileUID=6533"
+    expectedTeamID="268CCUR4WN"
+    #Company="Promise"
+    ;;
+pycharmce)
+    name="PyCharm CE"
+    type="dmg"
+    downloadURL="https://download.jetbrains.com/product?code=PCC&latest&distribution=mac"
+    expectedTeamID="2ZEFAR8TH3"
+    #Company="JetBrains"
+    ;;
+pymol)
+    name="PyMOL"
+    type="dmg"
+    downloadURL=$(curl -s -L "https://pymol.org/" | grep -m 1 -Eio 'href="https://pymol.org/installers/PyMOL-(.*)-MacOS(.*).dmg"' | cut -c7- | sed -e 's/"$//')
+    expectedTeamID="26SDDJ756N"
+    #Company="Schrödinger, Inc."
+    ;;
 r)
     # credit: Tadayuki Onishi (@kenchan0130)
     name="R"
@@ -1720,6 +1841,15 @@ resiliosynchome)
     downloadURL="https://download-cdn.resilio.com/stable/osx/Resilio-Sync.dmg"
     expectedTeamID="2953Z5SZSK"
     ;;
+ricohpsprinters)
+    name="Ricoh Printers"
+    type="pkgInDmg"
+    packageID="com.RICOH.print.PS_Printers_Vol4_EXP.ppds.pkg"
+    downloadURL=$(curl -fs https://support.ricoh.com//bb/html/dr_ut_e/rc3/model/mpc3004ex/mpc3004exen.htm | xmllint --html --format - 2>/dev/null | grep -m 1 -o "https://.*.dmg" | cut -d '"' -f 1)
+    expectedTeamID="5KACUT3YX8"
+    #Company="Ricoh"
+    #PatchSkip="YES"
+    ;;
 ringcentralapp)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
     name="Glip"
@@ -1728,6 +1858,15 @@ ringcentralapp)
     expectedTeamID="M932RC5J66"
     blockingProcesses=( "Glip" )
     ;;
+ringcentralclassicapp)
+    name="Glip"
+    type="dmg"
+    downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac"
+    expectedTeamID="M932RC5J66"
+    blockingProcesses=( "Glip" )
+    #blockingProcessesMaxCPU="5"
+    #Company="RingCentral"
+    ;;
 ringcentralmeetings)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
     name="Ring Central Meetings"
@@ -1736,6 +1875,15 @@ ringcentralmeetings)
     expectedTeamID="M932RC5J66"
     blockingProcesses=( "RingCentral Meetings" )
     ;;
+ringcentralphone)
+    # credit: Eric Gjerde, When I Work (@ericgjerde)
+    name="RingCentral for Mac"
+    type="dmg"
+    downloadURL="https://downloads.ringcentral.com/sp/RingCentralForMac"
+    expectedTeamID="M932RC5J66"
+    blockingProcesses=( "RingCentral Phone" )
+    #Company="RingCentral"
+    ;;
 royaltsx)
     name="Royal TSX"
     type="dmg"
@@ -1743,6 +1891,14 @@ royaltsx)
     appNewVersion=$(curl -fs https://royaltsx-v4.royalapps.com/updates_stable | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString'  2>/dev/null | cut -d '"' -f 2)
     expectedTeamID="VXP8K9EDP6"
     ;;
+rstudio)
+    name="RStudio"
+    type="dmg"
+    downloadURL=$(curl -s -L "https://rstudio.com/products/rstudio/download/" | grep -m 1 -Eio 'href="https://download1.rstudio.org/desktop/macos/RStudio-(.*).dmg"' | cut -c7- | sed -e 's/"$//')
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="FYF2F5GFX4"
+    #Company="RStudio"
+    ;;
 santa)
     # credit: Tadayuki Onishi (@kenchan0130)
     name="Santa"
@@ -1762,7 +1918,9 @@ sidekick)
     name="Sidekick"
     type="dmg"
     downloadURL="https://api.meetsidekick.com/downloads/df/mac"
+    appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/.*-x64-([0-9.]*)-.*/\1/g' )
     expectedTeamID="N975558CUS"
+    #Company="PushPlayLabs Inc."
     ;;
 signal)
     # credit: Søren Theilgaard (@theilgaard)
@@ -1870,13 +2028,6 @@ sublimetext)
     appNewVersion=$(curl -fs https://www.sublimetext.com/3 | grep 'class="latest"' | cut -d '>' -f 4 | sed -E 's/ (.*[0-9]*)<.*/\1/g')
     #appNewVersion=$(curl -Is https://download.sublimetext.com/latest/stable/osx | grep "Location:" | sed -n -e 's/^.*Sublime Text //p' | sed 's/.dmg//g' | sed $'s/[^[:print:]\t]//g') # Alternative from @Oh4sh0
     expectedTeamID="Z6D26JE4Y4"
-dbeaverce)
-    # credit: Adrian Bühler (@midni9ht) @ Gabe Marchan (darklink87)
-    name="DBeaver"
-    type="dmg"
-    downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg"
-    expectedTeamID="42B6MDKMW8"
-    blockingProcesses=( dbeaver )
     ;;
 suspiciouspackage)
     # credit: Mischa van der Bent (@mischavdbent)
@@ -1993,6 +2144,21 @@ umbrellaroamingclient)
     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"
     ;;
+universaltypeclient)
+    name="Universal Type Client"
+    type="pkgInZip"
+    downloadURL=https://bin.extensis.com/$( curl -fs https://www.extensis.com/support/universal-type-server-7/ | grep -o "UTC-[0-9].*M.zip" )
+    expectedTeamID="J6MMHGD9D6"
+    Company="Extensis"
+    ;;
+universaltypeclient)
+    name="Universal Type Client"
+    type="pkgInZip"
+    #packageID="com.extensis.UniversalTypeClient.universalTypeClient70.Info.pkg" # Does not contain the real version of the download
+    downloadURL=https://bin.extensis.com/$( curl -fs https://www.extensis.com/support/universal-type-server-7/ | grep -o "UTC-[0-9].*M.zip" )
+    expectedTeamID="J6MMHGD9D6"
+    #Company="Extensis"
+    ;;
 vagrant)
     # credit: AP Orlebeke (@apizz)
     name="Vagrant"
@@ -2066,6 +2232,7 @@ webexmeetings)
     downloadURL="https://akamaicdn.webex.com/client/webexapp.dmg"
     expectedTeamID="DE8Y96K9QP"
     targetDir="/Applications"
+    #blockingProcessesMaxCPU="5"
     blockingProcesses=( Webex )
     ;;
 webexteams)
@@ -2121,6 +2288,14 @@ yubikeymanagerqt)
     appNewVersion=$(versionFromGit Yubico yubikey-manager-qt)
     expectedTeamID="LQA3CS5MM7"
     ;;
+xeroxphaser7800)
+    name="XeroxPhaser"
+    type="pkgInDmg"
+    downloadURL=$(curl -fs "https://www.support.xerox.com/en-us/product/phaser-7800/downloads?platform=macOSx11" | xmllint --html --format - 2>/dev/null | grep -o "https://.*XeroxDrivers.*.dmg")
+    expectedTeamID="G59Y3XFNFR"
+    #Company=Xerox
+    #PatchSkip=YES
+    ;;
 zoom)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
     name="Zoom.us"
@@ -2130,6 +2305,65 @@ zoom)
     expectedTeamID="BJ4HAAB9B3"
     blockingProcesses=( zoom.us )
     ;;
+zoomclient)
+    name="zoom.us"
+    type="pkg"
+    packageID="us.zoom.pkg.videmeeting"
+    downloadURL="https://zoom.us/client/latest/Zoom.pkg"
+    expectedTeamID="BJ4HAAB9B3"
+    #appNewVersion=$(curl -is "https://beta2.communitypatch.com/jamf/v1/ba1efae22ae74a9eb4e915c31fef5dd2/patch/zoom.us" | grep currentVersion | tr ',' '\n' | grep currentVersion | cut -d '"' -f 4) # Does not match packageID
+    blockingProcesses=( zoom.us )
+    #blockingProcessesMaxCPU="5"
+    #Company="Zoom Inc."
+    #PatchSkip="YES"
+    ;;
+zulujdk11)
+    name="Zulu JDK 11"
+    type="pkgInDmg"
+    packageID="com.azulsystems.zulu.11"
+    if [[ $(arch) == i386 ]]; then
+      downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu11.*ca-jdk11.*x64.dmg" | sed 's/\\//g')
+    elif [[ $(arch) == arm64 ]]; then
+      downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu11.*ca-jdk11.*aarch64.dmg" | sed 's/\\//g')
+    fi
+    expectedTeamID="TDTHCUPYFR"
+    #appCustomVersion(){ java -version 2>&1 | grep Runtime | awk '{print $4}' | sed -e "s/.*Zulu//" | cut -d '-' -f 1 | sed -e "s/+/\./" }
+    #appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
+    #Company="Azul"
+    #PatchSkip="YES"
+    ;;
+zulujdk13)
+    name="Zulu JDK 13"
+    type="pkgInDmg"
+    packageID="com.azulsystems.zulu.13"
+    if [[ $(arch) == i386 ]]; then
+        downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu13.*ca-jdk13.*x64.dmg" | sed 's/\\//g')
+    elif [[ $(arch) == arm64 ]]; then
+        downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu13.*ca-jdk13.*aarch64.dmg" | sed 's/\\//g')
+    fi
+    expectedTeamID="TDTHCUPYFR"
+    #appCustomVersion(){ java -version 2>&1 | grep Runtime | awk '{print $4}' | sed -e "s/.*Zulu//" | cut -d '-' -f 1 | sed -e "s/+/\./" }
+    #appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
+    #Company="Azul"
+    #PatchSkip="YES"
+    ;;
+zulujdk15)
+    name="Zulu JDK 15"
+    type="pkgInDmg"
+    packageID="com.azulsystems.zulu.15"
+    if [[ $(arch) == i386 ]]; then
+        downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu15.*ca-jdk15.*x64.dmg" | sed 's/\\//g')
+    elif [[ $(arch) == arm64 ]]; then
+        downloadURL=$(curl -fs "https://www.azul.com/downloads/zulu-community/" | xmllint --html --format - 2>/dev/null | tr , '\n' | grep -o "https:.*/zulu15.*ca-jdk15.*aarch64.dmg" | sed 's/\\//g')
+    fi
+    expectedTeamID="TDTHCUPYFR"
+    #appCustomVersion(){ java -version 2>&1 | grep Runtime | awk '{print $4}' | sed -e "s/.*Zulu//" | cut -d '-' -f 1 | sed -e "s/+/\./" }
+    #appNewVersion=$(echo "$downloadURL" | cut -d "-" -f 1 | sed -e "s/.*zulu//") # Cannot be compared to anything
+    #Company="Azul"
+    #PatchSkip="YES"
+    ;;
+
+# MARK: Add new labels after this line (let us sort them in the list)
 
 
 # MARK: add new labels above here

From 60734956844e21f3de31c6bd696a9403b4a96f3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Wed, 17 Feb 2021 22:24:47 +0100
Subject: [PATCH 05/17] Update Installomator.sh

---
 Installomator.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 7249678..397fa3d 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -8,8 +8,8 @@
 # inspired by the download scripts from William Smith and Sander Schram
 # with additional ideas and contribution from Isaac Ordonez, Mann consulting
 
-VERSION='0.4.19'
-VERSIONDATE='2021-02-15'
+VERSION='0.4.20'
+VERSIONDATE='2021-02-17'
 
 export PATH=/usr/bin:/bin:/usr/sbin:/sbin
 

From 426168db71268fc61e2f3f1adf57198d005b1bf9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Thu, 18 Feb 2021 12:47:01 +0100
Subject: [PATCH 06/17] Update Installomator.sh

---
 Installomator.sh | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/Installomator.sh b/Installomator.sh
index 397fa3d..9f05e81 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -2296,6 +2296,13 @@ xeroxphaser7800)
     #Company=Xerox
     #PatchSkip=YES
     ;;
+zappy)
+    name="Zappy"
+    type="appInDmgInZip"
+    downloadURL="https://zappy.zapier.com/releases/zappy-latest.zip"
+    expectedTeamID="6LS97Q5E79"
+    #Company="Zapier"
+    ;;
 zoom)
     # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
     name="Zoom.us"

From 0fd6600358d0e98fd66abf0e54fa2e28e31b9388 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Mon, 22 Feb 2021 12:52:52 +0100
Subject: [PATCH 07/17] Update Installomator.sh

---
 Installomator.sh | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 9f05e81..99d5902 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -9,7 +9,7 @@
 # with additional ideas and contribution from Isaac Ordonez, Mann consulting
 
 VERSION='0.4.20'
-VERSIONDATE='2021-02-17'
+VERSIONDATE='2021-02-22'
 
 export PATH=/usr/bin:/bin:/usr/sbin:/sbin
 
@@ -232,14 +232,14 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name
     
     if [ -n "$archiveName" ]; then
     downloadURL=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \
-    | awk -F '"' "/browser_download_url/ && /$archiveName/ { print \$4 }")
+    | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
     else
     downloadURL=$(curl --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \
-    | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4 }")
+    | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
     fi
     if [ -z "$downloadURL" ]; then
-        printlog "could not retrieve download URL for $gitusername/$gitreponame"
-        exit 9
+        cleanupAndExit 9 "could not retrieve download URL for $gitusername/$gitreponame"
+        #exit 9
     else
         echo "$downloadURL"
         return 0
@@ -304,7 +304,8 @@ getAppVersion() {
         filteredAppPaths=( ${(M)appPathArray:#${targetDir}*} )
         if [[ ${#filteredAppPaths} -eq 1 ]]; then
             installedAppPath=$filteredAppPaths[1]
-            appversion=$(defaults read $installedAppPath/Contents/Info.plist CFBundleShortVersionString) #Not dependant on Spotlight indexing, Armin: appversion=$(mdls -name kMDItemVersion -raw $installedAppPath )
+            #appversion=$(mdls -name kMDItemVersion -raw $installedAppPath )
+            appversion=$(defaults read $installedAppPath/Contents/Info.plist CFBundleShortVersionString) #Not dependant on Spotlight indexing
             printlog "found app at $installedAppPath, version $appversion"
         else
             printlog "could not determine location of $appName"
@@ -456,15 +457,16 @@ installAppWithPath() { # $1: path to app to install in $targetDir
         printlog "Downloaded version of $name is $appNewVersion (replacing version $appversion)."
     fi
 
+    # skip install for DEBUG
+    if [ "$DEBUG" -ne 0 ]; then
+        printlog "DEBUG enabled, skipping remove, copy and chown steps"
+        return 0
+    fi
+
     # check for root
     if [ "$(whoami)" != "root" ]; then
         # not running as root
-        if [ "$DEBUG" -eq 0 ]; then
-            cleanupAndExit 6 "not running as root, exiting"
-        fi
-
-        printlog "DEBUG enabled, skipping copy and chown steps"
-        return 0
+        cleanupAndExit 6 "not running as root, exiting"
     fi
 
     # remove existing application
@@ -545,8 +547,7 @@ installFromPKG() {
     # check for root
     if [ "$(whoami)" != "root" ]; then
         # not running as root
-        printlog "not running as root, exiting"
-        cleanupAndExit 6
+        cleanupAndExit 6 "not running as root, exiting"
     fi
 
     # install pkg

From f082d1e4381d1c520cc9a2e646db155209b64308 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Mon, 22 Feb 2021 14:10:49 +0100
Subject: [PATCH 08/17] Update Installomator.sh

---
 Installomator.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 99d5902..93f26ac 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -684,8 +684,8 @@ fi
 # MARK: argument parsing
 if [[ $# -eq 0 ]]; then
     printlog "no label provided, printing labels"
-    grep -E '^[a-z0-9\-_]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
-    #grep -E '^[a-z0-9\-_]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
+    grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
+    #grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
     exit 0
 elif [[ $1 == "/" ]]; then
     # jamf uses sends '/' as the first argument

From 523883e6816f38c9519d8f4a05c3194310edf364 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Mon, 22 Feb 2021 21:54:22 +0100
Subject: [PATCH 09/17] Update Installomator.sh

---
 Installomator.sh | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 93f26ac..13e86db 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -1690,6 +1690,13 @@ omniplan3)
     appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
     expectedTeamID="34YW5XSRB7"
     ;;
+omniplan4)
+    name="OmniPlan"
+    type="dmg"
+    downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniPlan4" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2)
+    appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
+    expectedTeamID="34YW5XSRB7"
+    ;;
 omnipresence)
     name="OmniPresence"
     type="dmg"
@@ -1700,8 +1707,8 @@ omnipresence)
 onionshare)
     # credit: Søren Theilgaard (@theilgaard)
     name="OnionShare"
-    type="pkg"
-    downloadURL="https://onionshare.org$(curl -fs https://onionshare.org | grep "button.*pkg" | tr '"' '\n' | grep ".pkg")"
+    type="dmg"
+    downloadURL="https://onionshare.org$(curl -fs https://onionshare.org | grep "button.*dmg" | tr '"' '\n' | grep ".dmg")"
     appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' )
     expectedTeamID="N9B95FDWH4"
     ;;

From c3ec7958c2aad4d22528aa43e58140416c34cf05 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= 
Date: Wed, 17 Mar 2021 09:50:07 +0100
Subject: [PATCH 10/17] With LOGO variable, and no re-launch

Re-launch is not currently working as it gives problems with the keychain.
---
 Installomator.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 56 insertions(+), 5 deletions(-)

diff --git a/Installomator.sh b/Installomator.sh
index 13e86db..58a11b3 100755
--- a/Installomator.sh
+++ b/Installomator.sh
@@ -8,8 +8,8 @@
 # inspired by the download scripts from William Smith and Sander Schram
 # with additional ideas and contribution from Isaac Ordonez, Mann consulting
 
-VERSION='0.4.20'
-VERSIONDATE='2021-02-22'
+VERSION='0.4.22'
+VERSIONDATE='2021-??-??'
 
 export PATH=/usr/bin:/bin:/usr/sbin:/sbin
 
@@ -53,6 +53,16 @@ BLOCKING_PROCESS_ACTION=prompt_user
 #   - kill         kill process without prompting or giving the user a chance to save
 
 
+# logo-icon used in dialog boxes if app is blocking
+LOGO=appstore
+# options:
+#   - appstore      Icon is Apple App Store (default)
+#   - jamf          JAMF Pro
+#   - mosyleb       Mosyle Business
+#   - mosylem       Mosyle Manager (Education)
+# path can also be set in the command call, and if file exists, it will be used, like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"' (spaces are escaped).
+
+
 # install behavior
 INSTALL=""
 # options:
@@ -166,7 +176,7 @@ cleanupAndExit() { # $1 = exit code, $2 message
         hdiutil detach "$dmgmount"
     fi
     # If we closed any processes, reopen the app again
-    reopenClosedProcess
+    #reopenClosedProcess
     printlog "################## End Installomator, exit code $1 \n\n"
     exit "$1"
 }
@@ -181,13 +191,13 @@ runAsUser() {
 displaydialog() { # $1: message $2: title
     message=${1:-"Message"}
     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\" with icon caution)"
+    runAsUser osascript -e "button returned of (display dialog \"$message\" with  title \"$title\" buttons {\"Not Now\", \"Quit and Update\"} default button \"Quit and Update\" with icon POSIX file \"$LOGO\")"
 }
 
 displaydialogContinue() { # $1: message $2: title
     message=${1:-"Message"}
     title=${2:-"Installomator"}
-    runAsUser osascript -e "button returned of (display dialog \"$message\" with  title \"$title\" buttons {\"Quit and Update\"} default button \"Quit and Update\" with icon stop)"
+    runAsUser osascript -e "button returned of (display dialog \"$message\" with  title \"$title\" buttons {\"Quit and Update\"} default button \"Quit and Update\" with icon POSIX file \"$LOGO\")"
 }
 
 displaynotification() { # $1: message $2: title
@@ -1018,6 +1028,14 @@ citrixworkspace)
     appNewVersion=$(curl -fs https://www.citrix.com/downloads/workspace-app/mac/workspace-app-for-mac-latest.html | grep "

Version" | head -1 | cut -d " " -f1 | cut -d ";" -f2 | cut -d "." -f 1-3) expectedTeamID="S272Y5R93J" ;; +clevershare2) + # credit: Søren Theilgaard (@theilgaard) + name="Clevershare" + type="dmg" + downloadURL=$(curl -fs https://archive.clevertouch.com/clevershare2g | grep -i "_Mac" | tr '"' "\n" | grep "^http.*dmg") + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z-]*_Mac\.([0-9.]*)\.[0-9]*\.dmg$/\1/g' ) + expectedTeamID="P76M9BE8DQ" + ;; code42) # credit: Isaac Ordonez, Mann consulting (@mannconsulting) name="Code42" @@ -2726,6 +2744,39 @@ esac printlog "BLOCKING_PROCESS_ACTION=${BLOCKING_PROCESS_ACTION}" printlog "NOTIFY=${NOTIFY}" +# Finding LOGO to use in dialogs +case $LOGO in + appstore) + # Apple App Store on Mac + if [[ $(sw_vers -buildVersion) > "19" ]]; then + LOGO="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns" + else + LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns" + fi + ;; + jamf) + # Jamf Pro + LOGO="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns" + #LOGO="/Library/Application Support/JAMF/Logos/Logo512.png" + ;; + mosyleb) + # Mosyle Business + LOGO="/Applications/Business.app/Contents/Resources/AppIcon.icns" + ;; + mosylem) + # Mosyle Manager (education) + LOGO="/Applications/Manager.app/Contents/Resources/AppIcon.icns" + ;; +esac +if [[ ! -a "${LOGO}" ]]; then + if [[ $(sw_vers -buildVersion) > "19" ]]; then + LOGO="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns" + else + LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns" + fi +fi +printlog "LOGO=${LOGO}" + # MARK: extract info from data if [ -z "$archiveName" ]; then case $type in From a47ac798046efa0c73af272773a9db95f146b6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Wed, 17 Mar 2021 16:16:38 +0100 Subject: [PATCH 11/17] v0.4.23 version checking of pkg If type=pkg and packageID is set, then we can now check for version with that information. --- Installomator.sh | 68 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index 58a11b3..6e9bc64 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -1,4 +1,5 @@ #!/bin/zsh +label="" # if no label is sent to the script, this will be used # Installomator # @@ -8,7 +9,7 @@ # inspired by the download scripts from William Smith and Sander Schram # with additional ideas and contribution from Isaac Ordonez, Mann consulting -VERSION='0.4.22' +VERSION='0.4.23' VERSIONDATE='2021-??-??' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -20,7 +21,6 @@ export PATH=/usr/bin:/bin:/usr/sbin:/sbin # also no actual installation will be performed DEBUG=1 - # notify behavior NOTIFY=success # options: @@ -176,7 +176,7 @@ cleanupAndExit() { # $1 = exit code, $2 message hdiutil detach "$dmgmount" fi # If we closed any processes, reopen the app again - #reopenClosedProcess + reopenClosedProcess printlog "################## End Installomator, exit code $1 \n\n" exit "$1" } @@ -548,6 +548,28 @@ installFromPKG() { cleanupAndExit 5 fi + # Check version of pkg to be installed if packageID is set + if [[ $packageID != "" && $appversion != "" ]]; then + printlog "Checking package version." + pkgutil --expand "$archiveName" "$archiveName"_pkg + appNewVersion=$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | grep "$packageID" | tr ' ' '\n' | grep version | sed -E 's/.*\"([0-9.]*)\".*/\1/g') + rm -r "$archiveName"_pkg + printlog "Downloaded package $packageID version $appNewVersion" + if [[ $appversion == $appNewVersion ]]; then + printlog "Downloaded version of $name is the same as installed." + if [[ $INSTALL != "force" ]]; then + message="$name, version $appNewVersion, is the latest version." + if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then + printlog "notifying" + displaynotification "$message" "No update for $name!" + fi + cleanupAndExit 0 "No new version to install" + else + printlog "Using force to install anyway." + fi + fi + fi + # skip install for DEBUG if [ "$DEBUG" -ne 0 ]; then printlog "DEBUG enabled, skipping installation" @@ -693,10 +715,12 @@ fi # MARK: argument parsing if [[ $# -eq 0 ]]; then - printlog "no label provided, printing labels" - grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort - #grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort - exit 0 + if [[ -z $label ]]; then # check if label is set inside script + printlog "no label provided, printing labels" + grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "$0" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort + #grep -E '^[a-z0-9\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort + exit 0 + fi elif [[ $1 == "/" ]]; then # jamf uses sends '/' as the first argument printlog "shifting arguments for Jamf" @@ -1382,6 +1406,20 @@ hazel) appNewVersion=$(curl -fsI https://www.noodlesoft.com/Products/Hazel/download | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g') expectedTeamID="86Z3GCJ4MF" ;; +hpeasyadmin) + # credit: Søren Theilgaard (@theilgaard) + name="HP Easy Admin" + type="zip" + downloadURL="https://ftp.hp.com/pub/softlib/software12/HP_Quick_Start/osx/Applications/HP_Easy_Admin.app.zip" + expectedTeamID="6HB5Y2QTA3" + ;; +hpeasystart) + # credit: Søren Theilgaard (@theilgaard) + name="HP Easy Start" + type="zip" + downloadURL="https://ftp.hp.com/pub/softlib/software12/HP_Quick_Start/osx/Applications/HP_Easy_Start.app.zip" + expectedTeamID="6HB5Y2QTA3" + ;; hyper) # credit: Adrian Bühler (@midni9ht) name="Hyper" @@ -1666,6 +1704,15 @@ obsidian) appNewVersion=$(versionFromGit obsidianmd obsidian-releases) expectedTeamID="6JSW4SJWN9" ;; +odrive) + # credit: Søren Theilgaard (@theilgaard) + name="odrive" + type="pkg" + packageID="com.oxygen.odrive.installer-prod.pkg" + # https://docs.odrive.com/docs/odrive-usage-guide#install-desktop-sync + downloadURL="https://www.odrive.com/downloaddesktop?platform=mac" + expectedTeamID="N887K88VYZ" + ;; omnidisksweeper) name="OmniDiskSweeper" type="dmg" @@ -1758,6 +1805,13 @@ pacifist) downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg" expectedTeamID="HRLUCP7QP4" ;; +pdfsam) + name="PDFsam Basic" + type="dmg" + downloadURL=$(downloadURLFromGit torakiki pdfsam) + appNewVersion=$(versionFromGit torakiki pdfsam) + expectedTeamID="8XM3GHX436" + ;; pitch) name="Pitch" type="dmg" From a11dc1a49a495d82eb3f53df1bc1c5411a87f7e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Tue, 23 Mar 2021 13:43:37 +0100 Subject: [PATCH 12/17] v0.4.24 --- Installomator.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index 6e9bc64..c0012f4 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -9,7 +9,7 @@ label="" # if no label is sent to the script, this will be used # inspired by the download scripts from William Smith and Sander Schram # with additional ideas and contribution from Isaac Ordonez, Mann consulting -VERSION='0.4.23' +VERSION='0.4.24' VERSIONDATE='2021-??-??' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -423,7 +423,10 @@ reopenClosedProcess() { if [[ $appClosed == 1 ]]; then printlog "Telling app $name to open" - runAsUser osascript -e "tell app \"$name\" to open" + #runAsUser osascript -e "tell app \"$name\" to open" + runAsUser open -a "${name}" + processuser=$(ps aux | grep -i "${name}") + printlog "Reopened ${name} as $processuser" fi } @@ -552,7 +555,8 @@ installFromPKG() { if [[ $packageID != "" && $appversion != "" ]]; then printlog "Checking package version." pkgutil --expand "$archiveName" "$archiveName"_pkg - appNewVersion=$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | grep "$packageID" | tr ' ' '\n' | grep version | sed -E 's/.*\"([0-9.]*)\".*/\1/g') + #printlog "$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null)" + appNewVersion=$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | grep -i "$packageID" | tr ' ' '\n' | grep -i version | cut -d \" -f 2) #sed -E 's/.*\"([0-9.]*)\".*/\1/g' rm -r "$archiveName"_pkg printlog "Downloaded package $packageID version $appNewVersion" if [[ $appversion == $appNewVersion ]]; then @@ -2821,6 +2825,10 @@ case $LOGO in # Mosyle Manager (education) LOGO="/Applications/Manager.app/Contents/Resources/AppIcon.icns" ;; + addigy) + # Addigy + LOGO="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns" + ;; esac if [[ ! -a "${LOGO}" ]]; then if [[ $(sw_vers -buildVersion) > "19" ]]; then From 402b676ce506affa263f824789f6f9b172cf2203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Wed, 24 Mar 2021 08:40:10 +0100 Subject: [PATCH 13/17] Update Installomator.sh --- Installomator.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index c0012f4..4f8369d 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -10,7 +10,7 @@ label="" # if no label is sent to the script, this will be used # with additional ideas and contribution from Isaac Ordonez, Mann consulting VERSION='0.4.24' -VERSIONDATE='2021-??-??' +VERSIONDATE='2021-03-23' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -1700,11 +1700,7 @@ obsidian) # credit: Søren Theilgaard (@theilgaard) name="Obsidian" type="dmg" - if [[ $(arch) == "arm64" ]]; then - downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep "arm64" ) - elif [[ $(arch) == "i386" ]]; then - downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases | grep -v "arm64" ) - fi + downloadURL=$( downloadURLFromGit obsidianmd obsidian-releases ) appNewVersion=$(versionFromGit obsidianmd obsidian-releases) expectedTeamID="6JSW4SJWN9" ;; From 9fdf3783570b991ac7228082619db337d4f4bbbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Thu, 25 Mar 2021 14:51:51 +0100 Subject: [PATCH 14/17] Update buildCaseStatement.sh --- buildCaseStatement.sh | 74 +++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 27 deletions(-) diff --git a/buildCaseStatement.sh b/buildCaseStatement.sh index 4087013..14c8b41 100755 --- a/buildCaseStatement.sh +++ b/buildCaseStatement.sh @@ -20,7 +20,7 @@ fi # download the URL echo "Downloading $downloadURL" -if ! archivePath=$(curl -fsL "$downloadURL" --remote-header-name --remote-name -w "%{filename_effective}"); then +if ! downloadOut="$(curl -fsL "$downloadURL" --remote-header-name --remote-name -w "%{filename_effective}\n%{url_effective}\n")"; then echo "error downloading $downloadURL" exit 2 fi @@ -36,10 +36,36 @@ xpath() { fi } -#archivePath=$(find $tmpDir -print ) +pkgInvestigation() { + echo "Package found" + teamID=$(spctl -a -vv -t install "$archiveName" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ) + echo "For PKGs it's advised to find packageID for version checking" + + pkgutil --expand "$pkgPath" "$archiveName"_pkg + cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null + packageID="$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | tr ' ' '\n' | grep -i "id" | cut -d \" -f 2)" + rm -r "$archiveName"_pkg + echo "$packageID" + echo "Above is the possible packageIDs that can be used, and the correct one is probably one of those with a version number. More investigation might be needed to figure out correct packageID if several are displayed." +} +appInvestigation() { + appName=${appPath##*/} + + # verify with spctl + echo "Verifying: $appPath" + if ! teamID=$(spctl -a -vv "$appPath" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ); then + echo "Error verifying $appPath" + exit 4 + fi +} +echo "downloadOut: ${downloadOut}" +archiveTempName=$( echo "${downloadOut}" | head -1 ) +echo "archiveTempName: $archiveTempName" +archivePath=$( echo "${downloadOut}" | tail -1 ) echo "archivePath: $archivePath" archiveName=${archivePath##*/} echo "archiveName: $archiveName" +mv $archiveTempName $archiveName name=${archiveName%.*} echo "name: $name" archiveExt=${archiveName##*.} @@ -48,15 +74,8 @@ identifier=$(echo $name | tr '[:upper:]' '[:lower:]') echo "identifier: $identifier" if [ "$archiveExt" = "pkg" ]; then - echo "Package found" - teamID=$(spctl -a -vv -t install "$archiveName" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ) - echo "For PKGs it's advised to find packageID for version checking" - pkgutil --expand "$archiveName" "$archiveName"_pkg - cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null - packageID="$(cat "$archiveName"_pkg/Distribution | xpath '//installer-gui-script/pkg-ref[@id][@version]' 2>/dev/null | tr ' ' '\n' | grep -i "id" | cut -d \" -f 2)" - rm -r "$archiveName"_pkg - echo "$packageID" - echo "Above is the possible packageIDs that can be used, and the correct one is probably one of those with a version number. More investigation might be needed to figure out correct packageID if several are displayed." + pkgPath="$archiveName" + pkgInvestigation elif [ "$archiveExt" = "dmg" ]; then echo "Diskimage found" # mount the dmg @@ -66,16 +85,16 @@ elif [ "$archiveExt" = "dmg" ]; then exit 3 fi echo "Mounted: $dmgmount" - # check if app exists + # check if app og pkg exists appPath=$(find "$dmgmount" -name "*.app" -maxdepth 1 -print ) - appName=${appPath##*/} - - # verify with spctl - echo "Verifying: $appPath" - if ! teamID=$(spctl -a -vv "$appPath" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ); then - echo "Error verifying $appPath" - exit 4 + pkgPath=$(find "$dmgmount" -name "*.pkg" -maxdepth 1 -print ) + + if [[ $appPath != "" ]]; then + appInvestigation + elif [[ $pkgPath != "" ]]; then + archiveExt="pkgInDmg" + pkgInvestigation fi hdiutil detach "$dmgmount" @@ -84,20 +103,21 @@ elif [ "$archiveExt" = "zip" ] || [ "$archiveExt" = "tbz" ]; then # unzip the archive tar -xf "$archiveName" - # check if app exists + # check if app og pkg exists appPath=$(find "$tmpDir" -name "*.app" -maxdepth 2 -print ) - appName=${appPath##*/} - # verify with spctl - echo "Verifying: $appPath" - if ! teamID=$(spctl -a -vv "$appPath" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' ); then - echo "Error verifying $appPath" - exit 4 + pkgPath=$(find "$tmpDir" -name "*.pkg" -maxdepth 2 -print ) + + if [[ $appPath != "" ]]; then + appInvestigation + elif [[ $pkgPath != "" ]]; then + archiveExt="pkgInZip" + pkgInvestigation fi fi echo -echo "appNewVersion is often difficult to find. Can sometimes be found in the filename, but also on a web page." +echo "appNewVersion is often difficult to find. Can sometimes be found in the filename, but also on a web page. See archivePath above if link contains information about this." echo echo "$identifier)" echo " name=\"$name\"" From da821051869fd1ea2b67a723599323c842cf52ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Sat, 27 Mar 2021 17:02:35 +0100 Subject: [PATCH 15/17] v0.4.25 --- Installomator.sh | 57 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index 4f8369d..d47be9b 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -8,9 +8,10 @@ label="" # if no label is sent to the script, this will be used # # inspired by the download scripts from William Smith and Sander Schram # with additional ideas and contribution from Isaac Ordonez, Mann consulting +# and help from Søren Theilgaard (theilgaard.dk) -VERSION='0.4.24' -VERSIONDATE='2021-03-23' +VERSION='0.4.25' +VERSIONDATE='2021-??-??' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -996,6 +997,13 @@ bitwarden) appNewVersion=$(versionFromGit bitwarden desktop ) expectedTeamID="LTZ2PFU5D6" ;; +blender) + name="blender" + type="dmg" + downloadURL=$(redirect=$(curl -sfL https://www.blender.org/download/ | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) && curl -sfL "$redirect" | sed 's/.*href="//' | sed 's/".*//' | grep .dmg) + appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)-.*/\1/g' ) + expectedTeamID="68UA947AUU" + ;; bluejeans) name="BlueJeans" type="pkg" @@ -1008,7 +1016,12 @@ boxdrive) # credit: Isaac Ordonez, Mann consulting (@mannconsulting) name="Box" type="pkg" - downloadURL="https://e3.boxcdn.net/box-installers/desktop/releases/mac/Box.pkg" + if [[ $(arch) == "arm64" ]]; then + #Note: https://support.box.com/hc/en-us/articles/1500004479962-Box-Drive-support-on-devices-with-M1-chips + downloadURL="https://e3.boxcdn.net/desktop/pre-releases/mac/BoxDrive.2.20.140-M1-beta.pkg" + elif [[ $(arch) == "i386" ]]; then + downloadURL="https://e3.boxcdn.net/box-installers/desktop/releases/mac/Box.pkg" + fi expectedTeamID="M683GB7CPW" ;; brave) @@ -1799,6 +1812,13 @@ openvpnconnectv3) downloadURL="https://openvpn.net/downloads/openvpn-connect-v3-macos.dmg" expectedTeamID="ACV7L3WCD8" ;; +opera) + name="Opera" + type="dmg" + downloadURL="https://get.geo.opera.com/ftp/pub/opera/desktop/"$( curl -fs "https://get.geo.opera.com/ftp/pub/opera/desktop/" | grep href | tail -1 | tr '"' '\n' | grep "/" | head -1 )"mac/Opera_"$( curl -fs "https://get.geo.opera.com/ftp/pub/opera/desktop/" | grep href | tail -1 | tr '"' '\n' | grep "/" | head -1 | sed -E 's/^([0-9.]*)\//\1/g' )"_Setup.dmg" + appNewVersion="$( curl -fs "https://get.geo.opera.com/ftp/pub/opera/desktop/" | grep href | tail -1 | tr '"' '\n' | grep "/" | head -1 | sed -E 's/^([0-9]*\.[0-9]*).*\//\1/g' )" + expectedTeamID="A2P9LX4JPN" + ;; pacifist) name="Pacifist" type="dmg" @@ -1921,6 +1941,13 @@ resiliosynchome) downloadURL="https://download-cdn.resilio.com/stable/osx/Resilio-Sync.dmg" expectedTeamID="2953Z5SZSK" ;; +retrobatch) + name="Retrobatch" + type="zip" + downloadURL="https://flyingmeat.com/download/Retrobatch.zip" + appNewVersion=$(curl -fs "https://flyingmeat.com/retrobatch/" | grep -i download | grep -i zip | grep -iv Documentation | sed -E 's/.*Download.*href.*https.*zip.*Retrobatch ([0-9.]*)<.*/\1/g') + expectedTeamID="WZCN9HJ4VP" + ;; ricohpsprinters) name="Ricoh Printers" type="pkgInDmg" @@ -1964,6 +1991,12 @@ ringcentralphone) blockingProcesses=( "RingCentral Phone" ) #Company="RingCentral" ;; +rocket) + name="Rocket" + type="dmg" + downloadURL="https://macrelease.matthewpalmer.net/Rocket.dmg" + expectedTeamID="Z4JV2M65MH" + ;; royaltsx) name="Royal TSX" type="dmg" @@ -1988,6 +2021,12 @@ santa) appNewVersion=$(versionFromGit google santa) expectedTeamID="EQHXZ8M8AV" ;; +screamingfrogseospider) + name="Screaming Frog SEO Spider" + type="dmg" + downloadURL="https://download.screamingfrog.co.uk/products/seo-spider/ScreamingFrogSEOSpider-14.3.dmg" + expectedTeamID="CAHEVC3HZC" + ;; sfsymbols) name="SF Symbols" type="pkgInDmg" @@ -2124,6 +2163,13 @@ swiftruntimeforcommandlinetools) downloadURL="https://updates.cdn-apple.com/2019/cert/061-41823-20191025-5efc5a59-d7dc-46d3-9096-396bb8cb4a73/SwiftRuntimeForCommandLineTools.dmg" expectedTeamID="Software Update" ;; +tableaureader) + name="Tableau Reader" + type="pkgInDmg" + packageID="com.tableausoftware.reader.app" + downloadURL="https://www.tableau.com/downloads/reader/mac" + expectedTeamID="QJ4XPRK37C" + ;; taskpaper) # credit: Drew Diver (@grumpydrew on MacAdmins Slack) name="TaskPaper" @@ -2134,7 +2180,7 @@ taskpaper) teamviewer) name="TeamViewer" type="pkgInDmg" - pkgName="Install TeamViewer.pkg" + pkgName="Install TeamViewer.app/Contents/Resources/Install TeamViewer.pkg" downloadURL="https://download.teamviewer.com/download/TeamViewer.dmg" expectedTeamID="H7UGFBUGV6" ;; @@ -2142,7 +2188,7 @@ teamviewerhost) name="TeamViewerHost" type="pkgInDmg" packageID="com.teamviewer.teamviewerhost" - downloadURL="https://download.teamviewer.com/download/TeamViewerHost.dmg" + pkgName="Install TeamViewerHost.app/Contents/Resources/Install TeamViewerHost.pkg" downloadURL="https://download.teamviewer.com/download/TeamViewerHost.dmg" expectedTeamID="H7UGFBUGV6" #blockingProcessesMaxCPU="5" # Future feature #Company="TeamViewer GmbH" @@ -2811,7 +2857,6 @@ case $LOGO in jamf) # Jamf Pro LOGO="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns" - #LOGO="/Library/Application Support/JAMF/Logos/Logo512.png" ;; mosyleb) # Mosyle Business From 541f5a19fe0fa557163fb907568768d28d1ee466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Sun, 28 Mar 2021 09:20:13 +0200 Subject: [PATCH 16/17] v0.5.0 It will be versioned as version 0.5 --- Installomator.sh | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/Installomator.sh b/Installomator.sh index d47be9b..5a8139d 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -10,8 +10,8 @@ label="" # if no label is sent to the script, this will be used # with additional ideas and contribution from Isaac Ordonez, Mann consulting # and help from Søren Theilgaard (theilgaard.dk) -VERSION='0.4.25' -VERSIONDATE='2021-??-??' +VERSION='0.5.0' +VERSIONDATE='2021-03-28' export PATH=/usr/bin:/bin:/usr/sbin:/sbin @@ -1608,7 +1608,7 @@ lexarrecoverytool) # credit: Søren Theilgaard (@theilgaard) name="Lexar Recovery Tool" type="appInDmgInZip" - downloadURL="https://www.lexar.com$( curl -fs https://www.lexar.com/support/downloads/ | grep -i "mac" | grep -i "recovery" | head -1 | tr '"' '\n' | grep -i ".zip" )" + downloadURL="https://www.lexar.com$( curl -fs "https://www.lexar.com/support/downloads/" | grep -i "mac" | grep -i "recovery" | head -1 | tr '"' '\n' | grep -i ".zip" )" #appNewVersion="" expectedTeamID="Y8HM6WR2DV" ;; @@ -1764,7 +1764,8 @@ omnioutliner5) omniplan3) name="OmniPlan" type="dmg" - downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniPlan3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + #downloadURL=$(curl -fs "https://update.omnigroup.com/appcast/com.omnigroup.OmniPlan3" | xpath '//rss/channel/item[1]/enclosure[1]/@url' 2>/dev/null | head -1 | cut -d '"' -f 2) + downloadURL=$(curl -fs "https://www.omnigroup.com/download" | grep -i "OmniPlan-3" | head -1 | sed 's/.*href="//' | sed 's/".*//') appNewVersion=$( echo "${downloadURL}" | sed -E 's/.*\/[a-zA-Z]*-([0-9.]*)\..*/\1/g' ) expectedTeamID="34YW5XSRB7" ;; @@ -2073,14 +2074,6 @@ sketch) appNewVersion=$(curl -fs https://www.sketch.com/updates/ | grep "Sketch Version" | head -1 | sed -E 's/.*Version ([0-9.]*)<.*/\1/g') # version from update page expectedTeamID="WUGMZZ5K46" ;; -skitch) - # credit: Isaac Ordonez, Mann consulting (@mannconsulting) - name="Skitch" - type="zip" - downloadURL=$(curl -fs -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1 Safari/605.1.15" https://evernote.com/products/skitch | grep -o "https://.*zip") - expectedTeamID="J8RPQ294UB" - Company="Evernote" - ;; skype) name="Skype" type="dmg" From d63b38f50b3bc3a13db7693b2aa64b83e0cb4876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Sun, 28 Mar 2021 09:55:52 +0200 Subject: [PATCH 17/17] Update Installomator.sh --- Installomator.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installomator.sh b/Installomator.sh index 5a8139d..1a650cc 100755 --- a/Installomator.sh +++ b/Installomator.sh @@ -87,7 +87,7 @@ INSTALL="" # - pkg # - zip # - pkgInDmg -# - pkgInZip (not yet tested) +# - pkgInZip # - appInDmgInZip # # - packageID: (optional)