1 Commits

Author SHA1 Message Date
Søren Theilgaard
b42bd7e408 Trapping the script
Using these signals:
```
SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM SIGTSTP
```

Fixed #272
2022-02-08 13:11:08 +01:00
38 changed files with 204 additions and 604 deletions

View File

@@ -1,44 +1,7 @@
## v9.1 ## v10
**Note**: Both Google and Mozilla recommend using the pkg installers instead of the dmg downloads for managed deployments. So far, Installomator has provided labels for both. (`googlechrome` and `googlechromepkg` or `firefox` and `firefoxpkg`, respectively) Since there are problems with the dmg downloads, a future release of Installomator will _disable_ the `firefox` and `googlechrome` dmg labels. You should switch to using the respective pkg labels instead. - Now we trap the script, so if it is cancelled, we will run cleanupAndExit anyway, and have mounted diskimages unmounted and temporary files and folders removed.
-
- added option for Microsoft Endpoint Manager (Intune) to `LOGO` (#446)
- minor fixes (#427, #434, #436)
- the `googlechrome` label now always downloads the universal version (#430)
- new labels:
- 1passwordcli (#429)
- amazoncorretto8jdk (#423)
- autodeskfusion360admininstall (#447)
- axurerp10 (#439)
- calcservice (#426)
- clipy (#412)
- dockutil (#432)
- easyfind (#426)
- grammarly (#444)
- houdahspot (#426)
- macadminspython (#431)
- microsoftazuredatastudio (#438)
- nanosaur (#426)
- tembo (#426)
- wordservice (#426)
- xmenu (#426)
- updated labels:
- appcleaner (#428)
- dialog (#435, #437)
- googlechrome (#430)
- microsoftdefender (#440)
- supportapp (#426)
- zoom and zoomgov (#426, #433)
## v9.0.1
- improved logging levels throughout the script #408
- fixed a bug for `pkgindmg` style labels #408
- changed the criteria used to locate an app in the case the it cannot be found in the default locations, this should help with some apps with similar name (Virtual Box and Box Drive, #401) #413
- new label: WhiteBox Packages (`packages`) #415
- modified label: `loom` (added Apple silicon download) #417
## v9 ## v9

View File

@@ -80,7 +80,6 @@ LOGO=appstore
# - mosyleb Mosyle Business # - mosyleb Mosyle Business
# - mosylem Mosyle Manager (Education) # - mosylem Mosyle Manager (Education)
# - addigy Addigy # - addigy Addigy
# - microsoft Microsoft Endpoint Manager (Intune)
# path can also be set in the command call, and if file exists, it will be used. # 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"' # Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
# (spaces have to be escaped). # (spaces have to be escaped).
@@ -302,8 +301,8 @@ if [[ $(/usr/bin/arch) == "arm64" ]]; then
rosetta2=no rosetta2=no
fi fi
fi fi
VERSION="9.1" VERSION="9.0"
VERSIONDATE="2022-03-18" VERSIONDATE="2022-02-08"
# MARK: Functions # MARK: Functions
@@ -325,10 +324,8 @@ cleanupAndExit() { # $1 = exit code, $2 message, $3 level
reopenClosedProcess reopenClosedProcess
if [[ -n $2 && $1 -ne 0 ]]; then if [[ -n $2 && $1 -ne 0 ]]; then
printlog "ERROR: $2" $3 printlog "ERROR: $2" $3
else
printlog "$2" $3
fi fi
printlog "################## End Installomator, exit code $1 \n" REQ printlog "################## End Installomator, exit code $1 \n\n" REQ
# if label is wrong and we wanted name of the label, then return ################## # if label is wrong and we wanted name of the label, then return ##################
if [[ $RETURN_LABEL_NAME -eq 1 ]]; then if [[ $RETURN_LABEL_NAME -eq 1 ]]; then
@@ -463,10 +460,10 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name
fi fi
if [ -n "$archiveName" ]; then if [ -n "$archiveName" ]; then
downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ 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; exit }")
else else
downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ 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; exit }")
fi fi
if [ -z "$downloadURL" ]; then if [ -z "$downloadURL" ]; then
@@ -483,9 +480,9 @@ versionFromGit() {
gitusername=${1?:"no git user name"} gitusername=${1?:"no git user name"}
gitreponame=${2?:"no git repo name"} gitreponame=${2?:"no git repo name"}
appNewVersion=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g') 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 if [ -z "$appNewVersion" ]; then
printlog "could not retrieve version number for $gitusername/$gitreponame" WARN printlog "could not retrieve version number for $gitusername/$gitreponame"
appNewVersion="" appNewVersion=""
else else
echo "$appNewVersion" echo "$appNewVersion"
@@ -529,34 +526,19 @@ getAppVersion() {
fi fi
fi fi
# get app in targetDir, /Applications, or /Applications/Utilities # get app in /Applications, or /Applications/Utilities, or find using Spotlight
if [[ -d "$targetDir/$appName" ]]; then if [[ -d "/Applications/$appName" ]]; then
applist="$targetDir/$appName"
elif [[ -d "/Applications/$appName" ]]; then
applist="/Applications/$appName" applist="/Applications/$appName"
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# targetDir="/Applications"
# fi
elif [[ -d "/Applications/Utilities/$appName" ]]; then elif [[ -d "/Applications/Utilities/$appName" ]]; then
applist="/Applications/Utilities/$appName" applist="/Applications/Utilities/$appName"
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# targetDir="/Applications/Utilities"
# fi
else else
# applist=$(mdfind "kind:application $appName" -0 ) applist=$(mdfind "kind:application $appName" -0 )
printlog "name: $name, appName: $appName"
applist=$(mdfind "kind:application AND name:$name" -0 )
# printlog "App(s) found: ${applist}" DEBUG
# applist=$(mdfind "kind:application AND name:$appName" -0 )
fi fi
if [[ -z applist ]]; then if [[ -z applist ]]; then
printlog "No previous app found" INFO printlog "No previous app found" DEBUG
else else
printlog "App(s) found: ${applist}" INFO printlog "App(s) found: ${applist}" DEBUG
fi fi
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# printlog "targetDir for installation: $targetDir" INFO
# fi
appPathArray=( ${(0)applist} ) appPathArray=( ${(0)applist} )
@@ -579,10 +561,10 @@ getAppVersion() {
fi fi
fi fi
else else
printlog "could not determine location of $appName" WARN printlog "could not determine location of $appName"
fi fi
else else
printlog "could not find $appName" WARN printlog "could not find $appName"
fi fi
} }
@@ -709,7 +691,7 @@ reopenClosedProcess() {
processuser=$(ps aux | grep -i "${appName}" | grep -vi "grep" | awk '{print $1}') processuser=$(ps aux | grep -i "${appName}" | grep -vi "grep" | awk '{print $1}')
printlog "Reopened ${appName} as $processuser" printlog "Reopened ${appName} as $processuser"
else else
printlog "App not closed, so no reopen." INFO printlog "App not closed, so no reopen." DEBUG
fi fi
} }
@@ -719,7 +701,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# check if app exists # check if app exists
if [ ! -e "$appPath" ]; then if [ ! -e "$appPath" ]; then
cleanupAndExit 8 "could not find: $appPath" ERROR cleanupAndExit 8 "could not find: $appPath" DEBUG
fi fi
# verify with spctl # verify with spctl
@@ -751,12 +733,10 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No new version to install" REG cleanupAndExit 0 "No new version to install" INFO
else else
printlog "Using force to install anyway." printlog "Using force to install anyway."
fi fi
elif [[ -z $appversion ]]; then
printlog "Installing $name version $appNewVersion on versionKey $versionKey."
else else
printlog "Downloaded version of $name is $appNewVersion on versionKey $versionKey (replacing version $appversion)." printlog "Downloaded version of $name is $appNewVersion on versionKey $versionKey (replacing version $appversion)."
fi fi
@@ -772,7 +752,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying" printlog "notifying"
displaynotification "$message" "Error updating $name!" displaynotification "$message" "Error updating $name!"
fi fi
cleanupAndExit 6 "Installed macOS is too old for this app." ERROR cleanupAndExit 6 "Installed macOS is too old for this app." INFO
fi fi
fi fi
@@ -793,7 +773,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# remove existing application # remove existing application
if [ -e "$targetDir/$appName" ]; then if [ -e "$targetDir/$appName" ]; then
printlog "Removing existing $targetDir/$appName" WARN printlog "Removing existing $targetDir/$appName" DEBUG
deleteAppOut=$(rm -Rfv "$targetDir/$appName" 2>&1) deleteAppOut=$(rm -Rfv "$targetDir/$appName" 2>&1)
tempName="$targetDir/$appName" tempName="$targetDir/$appName"
tempNameLength=$((${#tempName} + 10)) tempNameLength=$((${#tempName} + 10))
@@ -804,21 +784,16 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# copy app to /Applications # copy app to /Applications
printlog "Copy $appPath to $targetDir" printlog "Copy $appPath to $targetDir"
copyAppOut=$(ditto -v "$appPath" "$targetDir/$appName" 2>&1) if ! ditto "$appPath" "$targetDir/$appName"; then
copyAppStatus=$(echo $?) cleanupAndExit 7 "Error while copying" ERROR
deduplicatelogs "$copyAppOut"
printlog "Debugging enabled, App copy output was:\n$logoutput" DEBUG
if [[ $copyAppStatus -ne 0 ]] ; then
#if ! ditto "$appPath" "$targetDir/$appName"; then
cleanupAndExit 7 "Error while copying:\n$logoutput" ERROR
fi fi
# set ownership to current user # set ownership to current user
if [[ "$currentUser" != "loginwindow" && $SYSTEMOWNER -ne 1 ]]; then if [[ "$currentUser" != "loginwindow" && $SYSTEMOWNER -ne 1 ]]; then
printlog "Changing owner to $currentUser" WARN printlog "Changing owner to $currentUser"
chown -R "$currentUser" "$targetDir/$appName" chown -R "$currentUser" "$targetDir/$appName"
else else
printlog "No user logged in or SYSTEMOWNER=1, setting owner to root:wheel" WARN printlog "No user logged in or SYSTEMOWNER=1, setting owner to root:wheel"
chown -R root:wheel "$targetDir/$appName" chown -R root:wheel "$targetDir/$appName"
fi fi
@@ -916,7 +891,7 @@ installFromPKG() {
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No new version to install" REQ cleanupAndExit 0 "No new version to install" INFO
else else
printlog "Using force to install anyway." printlog "Using force to install anyway."
fi fi
@@ -990,28 +965,27 @@ installPkgInDmg() {
if [[ -z $pkgName ]]; then if [[ -z $pkgName ]]; then
# find first file ending with 'pkg' # find first file ending with 'pkg'
findfiles=$(find "$dmgmount" -iname "*.pkg" -type f -maxdepth 1 ) findfiles=$(find "$dmgmount" -iname "*.pkg" -type f -maxdepth 1 )
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg in dmg $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg in dmg $archiveName" ERROR
fi fi
archiveName="${filearray[1]}" archiveName="${filearray[1]}"
printlog "found pkg: $archiveName"
else else
if [[ -s "$dmgmount/$pkgName" ]] ; then # was: $tmpDir if ls "$tmpDir/$pkgName" ; then
archiveName="$dmgmount/$pkgName" archiveName="$tmpDir/$pkgName"
else else
# try searching for pkg # try searching for pkg
findfiles=$(find "$dmgmount" -iname "$pkgName") # was: $tmpDir findfiles=$(find "$tmpDir" -iname "$pkgName")
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg “$pkgName” in dmg $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg “$pkgName” in zip $archiveName" ERROR
fi fi
# it is now safe to overwrite archiveName for installFromPKG # it is now safe to overwrite archiveName for installFromPKG
archiveName="${filearray[1]}" archiveName="${filearray[1]}"
printlog "found pkg: $archiveName"
fi fi
fi fi
printlog "found pkg: $archiveName"
# installFromPkgs # installFromPkgs
installFromPKG installFromPKG
@@ -1026,7 +1000,6 @@ installPkgInZip() {
if [[ -z $pkgName ]]; then if [[ -z $pkgName ]]; then
# find first file ending with 'pkg' # find first file ending with 'pkg'
findfiles=$(find "$tmpDir" -iname "*.pkg" -type f -maxdepth 2 ) findfiles=$(find "$tmpDir" -iname "*.pkg" -type f -maxdepth 2 )
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg in zip $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg in zip $archiveName" ERROR
@@ -1103,13 +1076,13 @@ runUpdateTool() {
printlog "Error running $updateTool, Procceding with normal installation. Exit Status: $updateStatus Error:\n$logoutput" WARN printlog "Error running $updateTool, Procceding with normal installation. Exit Status: $updateStatus Error:\n$logoutput" WARN
return 1 return 1
if [[ $type == updateronly ]]; then if [[ $type == updateronly ]]; then
cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" ERROR cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" WARN
fi fi
elif [[ $updateStatus -eq 0 ]]; then elif [[ $updateStatus -eq 0 ]]; then
printlog "Debugging enabled, update tool output was:\n$logoutput" DEBUG printlog "Debugging enabled, update tool output was:\n$logoutput" DEBUG
fi fi
else else
printlog "couldn't find $updateTool, continuing normally" WARN printlog "couldn't find $updateTool, continuing normally"
return 1 return 1
fi fi
return 0 return 0
@@ -1126,7 +1099,7 @@ finishing() {
message="Installed $name, version $appversion" message="Installed $name, version $appversion"
fi fi
printlog "$message" REQ printlog "$message"
if [[ $currentUser != "loginwindow" && ( $NOTIFY == "success" || $NOTIFY == "all" ) ]]; then if [[ $currentUser != "loginwindow" && ( $NOTIFY == "success" || $NOTIFY == "all" ) ]]; then
printlog "notifying" printlog "notifying"
@@ -1170,28 +1143,28 @@ autoload is-at-least
installedOSversion=$(sw_vers -productVersion) installedOSversion=$(sw_vers -productVersion)
if ! is-at-least 10.14 $installedOSversion; then if ! is-at-least 10.14 $installedOSversion; then
printlog "Installomator requires at least macOS 10.14 Mojave." ERROR printlog "Installomator requires at least macOS 10.14 Mojave."
exit 98 exit 98
fi fi
# MARK: argument parsing # MARK: argument parsing
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
if [[ -z $label ]]; then # check if label is set inside script if [[ -z $label ]]; then # check if label is set inside script
printlog "no label provided, printing labels" REQ 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\_-]*(\)|\|\\)$' "$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\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
exit 0 exit 0
fi fi
elif [[ $1 == "/" ]]; then elif [[ $1 == "/" ]]; then
# jamf uses sends '/' as the first argument # jamf uses sends '/' as the first argument
printlog "shifting arguments for Jamf" REQ printlog "shifting arguments for Jamf"
shift 3 shift 3
fi fi
while [[ -n $1 ]]; do while [[ -n $1 ]]; do
if [[ $1 =~ ".*\=.*" ]]; then if [[ $1 =~ ".*\=.*" ]]; then
# if an argument contains an = character, send it to eval # if an argument contains an = character, send it to eval
printlog "setting variable from argument $1" WARN printlog "setting variable from argument $1"
eval $1 eval $1
else else
# assume it's a label # assume it's a label
@@ -1263,31 +1236,31 @@ currentUser=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print
# MARK: check for root # MARK: check for root
if [[ "$(whoami)" != "root" && "$DEBUG" -eq 0 ]]; then if [[ "$(whoami)" != "root" && "$DEBUG" -eq 0 ]]; then
# not running as root # not running as root
cleanupAndExit 6 "not running as root, exiting" ERROR cleanupAndExit 6 "not running as root, exiting"
fi fi
# MARK: labels in case statement # MARK: labels in case statement
case $label in case $label in
longversion) longversion)
# print the script version # print the script version
printlog "Installomater: version $VERSION ($VERSIONDATE)" REQ printlog "Installomater: version $VERSION ($VERSIONDATE)"
exit 0 exit 0
;; ;;
valuesfromarguments) valuesfromarguments)
if [[ -z $name ]]; then if [[ -z $name ]]; then
printlog "need to provide 'name'" ERROR printlog "need to provide 'name'"
exit 1 exit 1
fi fi
if [[ -z $type ]]; then if [[ -z $type ]]; then
printlog "need to provide 'type'" ERROR printlog "need to provide 'type'"
exit 1 exit 1
fi fi
if [[ -z $downloadURL ]]; then if [[ -z $downloadURL ]]; then
printlog "need to provide 'downloadURL'" ERROR printlog "need to provide 'downloadURL'"
exit 1 exit 1
fi fi
if [[ -z $expectedTeamID ]]; then if [[ -z $expectedTeamID ]]; then
printlog "need to provide 'expectedTeamID'" ERROR printlog "need to provide 'expectedTeamID'"
exit 1 exit 1
fi fi
;; ;;
@@ -1302,15 +1275,6 @@ valuesfromarguments)
blockingProcesses=( "1Password Extension Helper" "1Password 7" "1Password (Safari)" "1PasswordNativeMessageHost" "1PasswordSafariAppExtension" ) blockingProcesses=( "1Password Extension Helper" "1Password 7" "1Password (Safari)" "1PasswordNativeMessageHost" "1PasswordSafariAppExtension" )
#forcefulQuit=YES #forcefulQuit=YES
;; ;;
1passwordcli)
name="1Password CLI"
type="pkg"
#packageID="com.1password.op"
downloadURL=$(curl -fs https://app-updates.agilebits.com/product_history/CLI | grep -m 1 -i op_apple_universal | cut -d'"' -f 2)
appNewVersion=$(echo $downloadURL | sed -E 's/.*\/[a-zA-Z_]*([0-9.]*)\..*/\1/g')
appCustomVersion(){ /usr/local/bin/op -v }
expectedTeamID="2BUA8C4S2C"
;;
4kvideodownloader) 4kvideodownloader)
name="4K Video Downloader" name="4K Video Downloader"
type="dmg" type="dmg"
@@ -1449,13 +1413,6 @@ amazonchime)
appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*-([0-9.]*)\..*/\1/g' ) appNewVersion=$( curl -fsIL "${downloadURL}" | grep -i "^location" | awk '{print $2}' | sed -E 's/.*\/[a-zA-Z.\-]*-([0-9.]*)\..*/\1/g' )
expectedTeamID="94KV3E626L" expectedTeamID="94KV3E626L"
;; ;;
amazoncorretto8jdk)
name="Amazon Corretto 8 JDK"
type="pkg"
downloadURL="https://corretto.aws/downloads/latest/amazon-corretto-8-x64-macos-jdk.pkg"
appNewVersion=$(curl -s https://raw.githubusercontent.com/corretto/corretto-8/develop/CHANGELOG.md | grep "## Corretto version" | head -n 1 | awk '{ print $4; exit}')
expectedTeamID="94KV3E626L"
;;
amazonworkspaces) amazonworkspaces)
# credit: Isaac Ordonez, Mann consulting (@mannconsulting) # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
name="Workspaces" name="Workspaces"
@@ -1485,10 +1442,10 @@ apparency)
expectedTeamID="936EB786NH" expectedTeamID="936EB786NH"
;; ;;
appcleaner) appcleaner)
# credit: Tadayuki Onishi (@kenchan0130)
name="AppCleaner" name="AppCleaner"
type="zip" type="zip"
downloadURL=$(curl -fs https://freemacsoft.net/appcleaner/Updates.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | tr " " "\n" | sort | tail -1 | cut -d '"' -f 2) 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)
appNewVersion=$(curl -fsL "https://freemacsoft.net/appcleaner/Updates.xml" | xpath '//rss/channel/item[last()]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="X85ZX835W9" expectedTeamID="X85ZX835W9"
;; ;;
applenyfonts) applenyfonts)
@@ -1586,16 +1543,6 @@ authydesktop)
appNewVersion="$(curl -sfL --output /dev/null -r 0-0 "${downloadURL}" --remote-header-name --remote-name -w "%{url_effective}\n" | grep -o -E '([a-zA-Z0-9\_.%-]*)\.(dmg|pkg|zip|tbz)$' | sed -E 's/.*-([0-9.]*)\.dmg/\1/g')" appNewVersion="$(curl -sfL --output /dev/null -r 0-0 "${downloadURL}" --remote-header-name --remote-name -w "%{url_effective}\n" | grep -o -E '([a-zA-Z0-9\_.%-]*)\.(dmg|pkg|zip|tbz)$' | sed -E 's/.*-([0-9.]*)\.dmg/\1/g')"
expectedTeamID="9EVH78F4V4" expectedTeamID="9EVH78F4V4"
;; ;;
autodeskfusion360admininstall)
name="Autodesk Fusion 360 Admin Install"
type="pkg"
packageID="com.autodesk.edu.fusion360"
downloadURL="https://dl.appstreaming.autodesk.com/production/installers/Autodesk%20Fusion%20360%20Admin%20Install.pkg"
appNewVersion=$(curl -fs "https://dl.appstreaming.autodesk.com/production/97e6dd95735340d6ad6e222a520454db/73e72ada57b7480280f7a6f4a289729f/full.json" | sed -E 's/.*build-version":"([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+).*/\1/g')
expectedTeamID="XXKJ396S2Y"
appName="Autodesk Fusion 360.app"
blockingProcesses=( "Autodesk Fusion 360" "Fusion 360" )
;;
autodmg) autodmg)
# credit: Mischa van der Bent (@mischavdbent) # credit: Mischa van der Bent (@mischavdbent)
name="AutoDMG" name="AutoDMG"
@@ -1634,20 +1581,6 @@ awsvpnclient)
expectedTeamID="94KV3E626L" expectedTeamID="94KV3E626L"
appNewVersion=$(curl -is "https://beta2.communitypatch.com/jamf/v1/ba1efae22ae74a9eb4e915c31fef5dd2/patch/AWSVPNClient" | grep currentVersion | tr ',' '\n' | grep currentVersion | cut -d '"' -f 4) appNewVersion=$(curl -is "https://beta2.communitypatch.com/jamf/v1/ba1efae22ae74a9eb4e915c31fef5dd2/patch/AWSVPNClient" | grep currentVersion | tr ',' '\n' | grep currentVersion | cut -d '"' -f 4)
;; ;;
axurerp10)
name="Axure RP 10"
type="dmg"
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://d3uii9pxdigrx1.cloudfront.net/AxureRP-Setup-arm64.dmg"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://d3uii9pxdigrx1.cloudfront.net/AxureRP-Setup.dmg"
fi
appNewVersion=$( curl -sL https://www.axure.com/release-history | grep -Eo '[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}' -m 1 )
expectedTeamID="HUMW6UU796"
versionKey="CFBundleVersion"
appName="Axure RP 10.app"
blockingProcesses=( "Axure RP 10" )
;;
balenaetcher) balenaetcher)
name="balenaEtcher" name="balenaEtcher"
type="dmg" type="dmg"
@@ -1775,13 +1708,6 @@ cakebrew)
appNewVersion=$( curl -fsL "https://www.cakebrew.com/appcast/profileInfo.php" | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2 ) appNewVersion=$( curl -fsL "https://www.cakebrew.com/appcast/profileInfo.php" | xpath '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2 )
expectedTeamID="R85D3K8ATT" expectedTeamID="R85D3K8ATT"
;; ;;
calcservice)
name="CalcService"
type="zip"
downloadURL="$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15" "https://www.devontechnologies.com/support/download" | tr '"' "\n" | grep -o "http.*download.*.zip" | grep -i calcservice | head -1)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;
calibre) calibre)
# credit: Drew Diver (@grumpydrew on MacAdmins Slack) # credit: Drew Diver (@grumpydrew on MacAdmins Slack)
name="calibre" name="calibre"
@@ -1856,13 +1782,6 @@ clickshare)
downloadURL=https://www.barco.com$(curl -fs "https://www.barco.com/en/clickshare/app" | grep -E -o '(\/\S*Download\?FileNumber=R3306192\S*ShowDownloadPage=False)' | tail -1) downloadURL=https://www.barco.com$(curl -fs "https://www.barco.com/en/clickshare/app" | grep -E -o '(\/\S*Download\?FileNumber=R3306192\S*ShowDownloadPage=False)' | tail -1)
expectedTeamID="P6CDJZR997" expectedTeamID="P6CDJZR997"
;; ;;
clipy)
name="Clipy"
type="dmg"
downloadURL=$(downloadURLFromGit Clipy Clipy)
appNewVersion=$(versionFromGit Clipy Clipy)
expectedTeamID="BBCHAJ584H"
;;
closeio) closeio)
name="Close.io" name="Close.io"
type="dmg" type="dmg"
@@ -2009,13 +1928,12 @@ devonthink)
appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 ) appNewVersion=$( echo ${downloadURL} | tr '/' '\n' | grep "[0-9]" | grep "[.]" | head -1 )
expectedTeamID="679S2QUWR8" expectedTeamID="679S2QUWR8"
;; ;;
dialog|\ dialog)
swiftdialog)
name="Dialog" name="Dialog"
type="pkg" type="pkg"
packageID="au.csiro.dialogcli" packageID="au.csiro.dialogcli"
downloadURL="$(downloadURLFromGit bartreardon swiftDialog)" downloadURL="$(downloadURLFromGit bartreardon Dialog)"
appNewVersion="$(versionFromGit bartreardon swiftDialog)" appNewVersion="$(versionFromGit bartreardon Dialog)"
expectedTeamID="PWA5E9TQ59" expectedTeamID="PWA5E9TQ59"
;; ;;
dialpad) dialpad)
@@ -2051,15 +1969,6 @@ docker)
fi fi
expectedTeamID="9BNSXJN65R" expectedTeamID="9BNSXJN65R"
;; ;;
dockutil)
name="dockutil"
type="pkg"
packageID="dockutil.cli.tool"
downloadURL=$(downloadURLFromGit "kcrawford" "dockutil")
appNewVersion=$(versionFromGit "kcrawford" "dockutil")
expectedTeamID="Z5J8CJBUWC"
blockingProcesses=( NONE )
;;
drift) drift)
# credit Elena Ackley (@elenaelago) # credit Elena Ackley (@elenaelago)
name="Drift" name="Drift"
@@ -2081,13 +1990,6 @@ easeusdatarecoverywizard)
#appNewVersion="" #appNewVersion=""
expectedTeamID="DLLVW95FSM" expectedTeamID="DLLVW95FSM"
;; ;;
easyfind)
name="EasyFind"
type="zip"
downloadURL="$(curl -fs "https://www.devontechnologies.com/apps/freeware" | grep -o "http.*download.*.zip" | grep -i easyfind)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;
egnyte) egnyte)
# credit: #MoeMunyoki from MacAdmins Slack # credit: #MoeMunyoki from MacAdmins Slack
name="Egnyte Connect" name="Egnyte Connect"
@@ -2343,8 +2245,15 @@ golang)
googlechrome) googlechrome)
name="Google Chrome" name="Google Chrome"
type="dmg" type="dmg"
downloadURL="https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg" if [[ $(arch) != "i386" ]]; then
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}') 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}')
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}')
fi
expectedTeamID="EQHXZ8M8AV" expectedTeamID="EQHXZ8M8AV"
;; ;;
googlechromepkg) googlechromepkg)
@@ -2423,15 +2332,6 @@ gpgsync)
appNewVersion="$(versionFromGit firstlookmedia gpgsync)" appNewVersion="$(versionFromGit firstlookmedia gpgsync)"
expectedTeamID="P24U45L8P5" expectedTeamID="P24U45L8P5"
;; ;;
grammarly)
name="Grammarly Desktop"
type="dmg"
packageID="com.grammarly.ProjectLlama"
downloadURL=$(curl -fsL "https://download-mac.grammarly.com/appcast.xml" | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="W8F64X92K3"
appNewVersion=$(curl -is "https://download-mac.grammarly.com/appcast.xml" | grep sparkle:version | tr ',' '\n' | grep sparkle:version | cut -d '"' -f 4)
appName="Grammarly Installer.app"
;;
grandperspective) grandperspective)
name="GrandPerspective" name="GrandPerspective"
type="dmg" type="dmg"
@@ -2486,13 +2386,6 @@ 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') 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" expectedTeamID="86Z3GCJ4MF"
;; ;;
houdahspot)
name="HoudahSpot"
type="zip"
downloadURL="$(curl -fs https://www.houdah.com/houdahSpot/updates/cast6.php | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
appNewVersion="$(curl -fs https://www.houdah.com/houdahSpot/updates/cast6.php | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
expectedTeamID="DKGQD8H8ZY"
;;
hpeasyadmin) hpeasyadmin)
# credit: Søren Theilgaard (@theilgaard) # credit: Søren Theilgaard (@theilgaard)
name="HP Easy Admin" name="HP Easy Admin"
@@ -2902,11 +2795,7 @@ loom)
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack) # credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
name="Loom" name="Loom"
type="dmg" type="dmg"
if [[ $(arch) == "arm64" ]]; then 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)
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/ && /arm64/ && /dmg/ {print $3}' | head -1)
elif [[ $(arch) == "i386" ]]; then
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)
fi
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}' ) 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" expectedTeamID="QGD2ZPXZZG"
;; ;;
@@ -2934,15 +2823,6 @@ lulu)
appNewVersion=$(versionFromGit objective-see LuLu) appNewVersion=$(versionFromGit objective-see LuLu)
expectedTeamID="VBG97UB4TA" expectedTeamID="VBG97UB4TA"
;; ;;
macadminspython)
name="MacAdmins Python"
type="pkg"
packageID="org.macadmins.python.recommended"
downloadURL=$(curl --silent --fail "https://api.github.com/repos/macadmins/python/releases/latest" | awk -F '"' "/browser_download_url/ && /python_recommended_signed/ { print \$4; exit }")
appNewVersion=$(grep -o -E '\d+\.\d+\.\d+\.\d+' <<< $downloadURL | head -n 1)
expectedTeamID="9GQZ7KUFR6"
blockingProcesses=( NONE )
;;
maccyapp) maccyapp)
name="Maccy" name="Maccy"
type="zip" type="zip"
@@ -3039,16 +2919,6 @@ microsoftautoupdate)
#updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" #updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
#updateToolArguments=( --install --apps MSau04 ) #updateToolArguments=( --install --apps MSau04 )
;; ;;
microsoftazuredatastudio|\
azuredatastudio)
name="Azure Data Studio"
type="zip"
downloadURL=$( curl -sL https://github.com/microsoft/azuredatastudio/releases/latest | grep 'macOS ZIP' | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" )
appNewVersion=$(versionFromGit microsoft azuredatastudio )
expectedTeamID="UBF8T346G9"
appName="Azure Data Studio.app"
blockingProcesses=( "Azure Data Studio" )
;;
microsoftazurestorageexplorer) microsoftazurestorageexplorer)
name="Microsoft Azure Storage Explorer" name="Microsoft Azure Storage Explorer"
type="zip" type="zip"
@@ -3071,9 +2941,8 @@ microsoftcompanyportal)
updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate" updateTool="/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app/Contents/MacOS/msupdate"
updateToolArguments=( --install --apps IMCP01 ) updateToolArguments=( --install --apps IMCP01 )
;; ;;
microsoftdefender|\
microsoftdefenderatp) microsoftdefenderatp)
name="Microsoft Defender" name="Microsoft Defender ATP"
type="pkg" type="pkg"
downloadURL="https://go.microsoft.com/fwlink/?linkid=2097502" 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/<version>([0-9.]*) .*/\1/') appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.defender.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')
@@ -3423,13 +3292,6 @@ muzzle)
appNewVersion=$(curl -fs https://muzzleapp.com/updates/ | grep -io 'h2.*Version.* [0-9.]*.*h2' | head -1 | sed -E 's/.*ersion *([0-9.]*).*/\1/g') appNewVersion=$(curl -fs https://muzzleapp.com/updates/ | grep -io 'h2.*Version.* [0-9.]*.*h2' | head -1 | sed -E 's/.*ersion *([0-9.]*).*/\1/g')
expectedTeamID="49EYHPJ4Q3" expectedTeamID="49EYHPJ4Q3"
;; ;;
nanosaur)
name="Nanosaur"
type="dmg"
downloadURL=$(downloadURLFromGit jorio Nanosaur)
appNewVersion=$(versionFromGit jorio Nanosaur)
expectedTeamID="RVNL7XC27G"
;;
netnewswire) netnewswire)
name="NetNewsWire" name="NetNewsWire"
type="zip" type="zip"
@@ -3632,15 +3494,6 @@ pacifist)
downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg" downloadURL="https://charlessoft.com/cgi-bin/pacifist_download.cgi?type=dmg"
expectedTeamID="HRLUCP7QP4" expectedTeamID="HRLUCP7QP4"
;; ;;
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"
;;
pandoc) pandoc)
name="Pandoc" name="Pandoc"
type="pkg" type="pkg"
@@ -4177,14 +4030,13 @@ superhuman)
expectedTeamID="6XHFYUTQGX" expectedTeamID="6XHFYUTQGX"
;; ;;
supportapp) supportapp)
# credit: Søren Theilgaard (@theilgaard)
name="Support" name="Support"
type="pkg" type="pkg"
packageID="nl.root3.support" packageID="nl.root3.support"
downloadURL=$(downloadURLFromGit root3nl SupportApp) downloadURL=$(downloadURLFromGit root3nl SupportApp)
appNewVersion=$(versionFromGit root3nl SupportApp) appNewVersion=$(versionFromGit root3nl SupportApp)
expectedTeamID="98LJ4XBGYK" expectedTeamID="98LJ4XBGYK"
uid=$(id -u "$currentUser")
launchctl bootout gui/${uid} "/Library/LaunchAgents/nl.root3.support.plist"
;; ;;
suspiciouspackage) suspiciouspackage)
# credit: Mischa van der Bent (@mischavdbent) # credit: Mischa van der Bent (@mischavdbent)
@@ -4292,13 +4144,6 @@ telegram)
appNewVersion=$( curl -fs https://macos.telegram.org | grep anchor | head -1 | sed -E 's/.*a>([0-9.]*) .*/\1/g' ) appNewVersion=$( curl -fs https://macos.telegram.org | grep anchor | head -1 | sed -E 's/.*a>([0-9.]*) .*/\1/g' )
expectedTeamID="6N38VWS5BX" expectedTeamID="6N38VWS5BX"
;; ;;
tembo)
name="Tembo"
type="zip"
downloadURL="$(curl -fs https://www.houdah.com/tembo/updates/cast2.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
appNewVersion="$(curl -fs https://www.houdah.com/tembo/updates/cast2.xml | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
expectedTeamID="DKGQD8H8ZY"
;;
textexpander) textexpander)
name="TextExpander" name="TextExpander"
type="dmg" type="dmg"
@@ -4574,14 +4419,6 @@ wireshark)
appNewVersion=$(curl -fs https://www.wireshark.org/download.html | grep -i "href.*_stable" | sed -E 's/.*\(([0-9.]*)\).*/\1/g') appNewVersion=$(curl -fs https://www.wireshark.org/download.html | grep -i "href.*_stable" | sed -E 's/.*\(([0-9.]*)\).*/\1/g')
expectedTeamID="7Z6EMTD2C6" expectedTeamID="7Z6EMTD2C6"
;; ;;
wordservice)
name="WordService"
type="zip"
downloadURL="$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15" "https://www.devontechnologies.com/support/download" | tr '"' "\n" | grep -o "http.*download.*.zip" | grep -i wordservice | head -1)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
appNewVersion=""
expectedTeamID="679S2QUWR8"
;;
wwdc) wwdc)
# credit: Søren Theilgaard (@theilgaard) # credit: Søren Theilgaard (@theilgaard)
name="WWDC" name="WWDC"
@@ -4604,14 +4441,6 @@ xink)
appNewVersion=$(curl -fs "https://downloads.xink.io/macos/appcast" | xpath '(//rss/channel/item/enclosure/@sparkle:version)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2) appNewVersion=$(curl -fs "https://downloads.xink.io/macos/appcast" | xpath '(//rss/channel/item/enclosure/@sparkle:version)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)
expectedTeamID="F287823HVS" expectedTeamID="F287823HVS"
;; ;;
xmenu)
name="XMenu"
type="zip"
downloadURL="$(curl -fs "https://www.devontechnologies.com/apps/freeware" | grep -o "http.*download.*.zip" | grep -i xmenu)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;
xquartz) xquartz)
# credit: AP Orlebeke (@apizz) # credit: AP Orlebeke (@apizz)
name="XQuartz" name="XQuartz"
@@ -4677,7 +4506,6 @@ zoom)
downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg" downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)" appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
expectedTeamID="BJ4HAAB9B3" expectedTeamID="BJ4HAAB9B3"
versionKey="CFBundleVersion"
;; ;;
zoomclient) zoomclient)
name="zoom.us" name="zoom.us"
@@ -4699,7 +4527,6 @@ zoomgov)
downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg" downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)" appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
expectedTeamID="BJ4HAAB9B3" expectedTeamID="BJ4HAAB9B3"
versionKey="CFBundleVersion"
;; ;;
zoomrooms) zoomrooms)
name="ZoomRooms" name="ZoomRooms"
@@ -4778,13 +4605,13 @@ zulujdk8)
*) *)
# unknown label # unknown label
#printlog "unknown label $label" #printlog "unknown label $label"
cleanupAndExit 1 "unknown label $label" ERROR cleanupAndExit 1 "unknown label $label"
;; ;;
esac esac
# Are we only asked to return label name # Are we only asked to return label name
if [[ $RETURN_LABEL_NAME -eq 1 ]]; then if [[ $RETURN_LABEL_NAME -eq 1 ]]; then
printlog "Only returning label name." REQ printlog "Only returning label name."
printlog "$name" printlog "$name"
echo "$name" echo "$name"
exit exit
@@ -4795,7 +4622,7 @@ fi
if [[ ${INTERRUPT_DND} = "no" ]]; then if [[ ${INTERRUPT_DND} = "no" ]]; then
# Check if a fullscreen app is active # Check if a fullscreen app is active
if hasDisplaySleepAssertion; then if hasDisplaySleepAssertion; then
cleanupAndExit 1 "active display sleep assertion detected, aborting" ERROR cleanupAndExit 1 "active display sleep assertion detected, aborting"
fi fi
fi fi
@@ -4832,11 +4659,6 @@ case $LOGO in
LOGO="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns" LOGO="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
if [[ -z $MDMProfileName ]]; then; MDMProfileName="MDM Profile"; fi if [[ -z $MDMProfileName ]]; then; MDMProfileName="MDM Profile"; fi
;; ;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
if [[ -z $MDMProfileName ]]; then; MDMProfileName="Management Profile"; fi
;;
esac esac
if [[ ! -a "${LOGO}" ]]; then if [[ ! -a "${LOGO}" ]]; then
if [[ $(sw_vers -buildVersion) > "19" ]]; then if [[ $(sw_vers -buildVersion) > "19" ]]; then
@@ -4845,9 +4667,9 @@ if [[ ! -a "${LOGO}" ]]; then
LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns" LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi fi
fi fi
printlog "LOGO=${LOGO}" INFO printlog "LOGO=${LOGO}"
printlog "Label type: $type" INFO printlog "Label type: $type"
# MARK: extract info from data # MARK: extract info from data
if [ -z "$archiveName" ]; then if [ -z "$archiveName" ]; then
@@ -4869,7 +4691,7 @@ if [ -z "$archiveName" ]; then
;; ;;
esac esac
fi fi
printlog "archiveName: $archiveName" INFO printlog "archiveName: $archiveName" DEBUG
if [ -z "$appName" ]; then if [ -z "$appName" ]; then
# when not given derive from name # when not given derive from name
@@ -4887,13 +4709,14 @@ if [ -z "$targetDir" ]; then
updateronly) updateronly)
;; ;;
*) *)
cleanupAndExit 99 "Cannot handle type $type" ERROR printlog "Cannot handle type $type"
cleanupAndExit 99
;; ;;
esac esac
fi fi
if [[ -z $blockingProcesses ]]; then if [[ -z $blockingProcesses ]]; then
printlog "no blocking processes defined, using $name as default" INFO printlog "no blocking processes defined, using $name as default"
blockingProcesses=( $name ) blockingProcesses=( $name )
fi fi
@@ -4909,7 +4732,8 @@ fi
# MARK: change directory to temporary working directory # MARK: change directory to temporary working directory
printlog "Changing directory to $tmpDir" DEBUG printlog "Changing directory to $tmpDir" DEBUG
if ! cd "$tmpDir"; then if ! cd "$tmpDir"; then
cleanupAndExit 1 "error changing directory $tmpDir" ERROR printlog "error changing directory $tmpDir"
cleanupAndExit 1
fi fi
# MARK: get installed version # MARK: get installed version
@@ -4932,10 +4756,10 @@ if [[ -n $appNewVersion ]]; then
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No newer version." REQ cleanupAndExit 0 "No newer version."
fi fi
else else
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app." WARN printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app."
fi fi
fi fi
else else
@@ -4948,12 +4772,13 @@ if [[ (-n $appversion && -n "$updateTool") || "$type" == "updateronly" ]]; then
if [[ $DEBUG -ne 1 ]]; then if [[ $DEBUG -ne 1 ]]; then
if runUpdateTool; then if runUpdateTool; then
finishing finishing
cleanupAndExit 0 "updateTool has run" REQ cleanupAndExit 0
elif [[ $type == "updateronly" ]];then elif [[ $type == "updateronly" ]];then
cleanupAndExit 0 "type is $type so we end here." REQ printlog "type is $type so we end here."
cleanupAndExit 0
fi # otherwise continue fi # otherwise continue
else else
printlog "DEBUG mode 1 enabled, not running update tool" WARN printlog "DEBUG mode 1 enabled, not running update tool"
fi fi
fi fi
@@ -4976,14 +4801,14 @@ else
deduplicatelogs "$curlDownload" deduplicatelogs "$curlDownload"
if [[ $curlDownloadStatus -ne 0 ]]; then if [[ $curlDownloadStatus -ne 0 ]]; then
#if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then #if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then
printlog "error downloading $downloadURL" ERROR printlog "error downloading $downloadURL"
message="$name update/installation failed. This will be logged, so IT can follow up." message="$name update/installation failed. This will be logged, so IT can follow up."
if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
printlog "notifying" printlog "notifying"
if [[ $updateDetected == "YES" ]]; then if [[ $updateDetected == "YES" ]]; then
displaynotification "$message" "Error updating $name" displaynotification "$message" "Error updating $name" ERROR
else else
displaynotification "$message" "Error installing $name" displaynotification "$message" "Error installing $name" ERROR
fi fi
fi fi
printlog "File list: $(ls -lh "$archiveName")" ERROR printlog "File list: $(ls -lh "$archiveName")" ERROR
@@ -5048,7 +4873,8 @@ case $type in
installAppInDmgInZip installAppInDmgInZip
;; ;;
*) *)
cleanupAndExit 99 "Cannot handle type $type" ERROR printlog "Cannot handle type $type"
cleanupAndExit 99
;; ;;
esac esac
@@ -5056,4 +4882,4 @@ esac
finishing finishing
# all done! # all done!
cleanupAndExit 0 "All done!" REQ cleanupAndExit 0

View File

@@ -1,5 +1,4 @@
1password7 1password7
1passwordcli
4kvideodownloader 4kvideodownloader
8x8 8x8
abstract abstract
@@ -17,7 +16,6 @@ alephone
alfred alfred
alttab alttab
amazonchime amazonchime
amazoncorretto8jdk
amazonworkspaces amazonworkspaces
androidfiletransfer androidfiletransfer
anydesk anydesk
@@ -36,14 +34,11 @@ atext
atom atom
audacity audacity
authydesktop authydesktop
autodeskfusion360admininstall
autodmg autodmg
autopkgr autopkgr
aviatrix aviatrix
awscli2 awscli2
awsvpnclient awsvpnclient
axurerp10
azuredatastudio
balenaetcher balenaetcher
balsamiqwireframes balsamiqwireframes
bartender bartender
@@ -60,7 +55,6 @@ brave
bugdom bugdom
caffeine caffeine
cakebrew cakebrew
calcservice
calibre calibre
camostudio camostudio
camtasia camtasia
@@ -70,7 +64,6 @@ cisdem-documentreader
citrixworkspace citrixworkspace
clevershare2 clevershare2
clickshare clickshare
clipy
closeio closeio
cloudya cloudya
code42 code42
@@ -95,11 +88,9 @@ dialpad
discord discord
diskspace diskspace
docker docker
dockutil
drift drift
dropbox dropbox
easeusdatarecoverywizard easeusdatarecoverywizard
easyfind
egnyte egnyte
element element
eraseinstall eraseinstall
@@ -139,7 +130,6 @@ googlesoftwareupdate
gotomeeting gotomeeting
gpgsuite gpgsuite
gpgsync gpgsync
grammarly
grandperspective grandperspective
grasshopper grasshopper
gyazo gyazo
@@ -147,7 +137,6 @@ gyazogif
hancock hancock
handbrake handbrake
hazel hazel
houdahspot
hpeasyadmin hpeasyadmin
hpeasystart hpeasystart
hyper hyper
@@ -198,7 +187,6 @@ loom
lowprofile lowprofile
lucifer lucifer
lulu lulu
macadminspython
maccyapp maccyapp
macfuse macfuse
macports macports
@@ -209,10 +197,8 @@ marathoninfinity
mattermost mattermost
menumeters menumeters
microsoftautoupdate microsoftautoupdate
microsoftazuredatastudio
microsoftazurestorageexplorer microsoftazurestorageexplorer
microsoftcompanyportal microsoftcompanyportal
microsoftdefender
microsoftdefenderatp microsoftdefenderatp
microsoftedge microsoftedge
microsoftedgeconsumerstable microsoftedgeconsumerstable
@@ -243,7 +229,6 @@ montereyblocker
mowgliiitsycal mowgliiitsycal
musescore musescore
muzzle muzzle
nanosaur
netnewswire netnewswire
nextcloud nextcloud
nomad nomad
@@ -270,7 +255,6 @@ opera
ottomatic ottomatic
overflow overflow
pacifist pacifist
packages
pandoc pandoc
paretosecurity paretosecurity
parsec parsec
@@ -350,7 +334,6 @@ sublimetext
superhuman superhuman
supportapp supportapp
suspiciouspackage suspiciouspackage
swiftdialog
swiftruntimeforcommandlinetools swiftruntimeforcommandlinetools
sync sync
tableaudesktop tableaudesktop
@@ -364,7 +347,6 @@ teamviewerhost
teamviewerqs teamviewerqs
techsmithcapture techsmithcapture
telegram telegram
tembo
textexpander textexpander
textmate textmate
theunarchiver theunarchiver
@@ -402,11 +384,9 @@ whatsapp
wickrme wickrme
wickrpro wickrpro
wireshark wireshark
wordservice
wwdc wwdc
xeroxphaser7800 xeroxphaser7800
xink xink
xmenu
xquartz xquartz
yed yed
yubikeymanagerqt yubikeymanagerqt

View File

@@ -12,7 +12,7 @@ We have put a lot of work into making it stable and safe, but we cannot - of cou
## Authors ## Authors
Intallomator was originally inspired by the download scripts from William Smith and Sander Schram, and created by: Intallomator was original inspired by the download scripts from William Smith and Sander Schram, and created by:
Armin Briegel - @scriptingosx Armin Briegel - @scriptingosx
Later on a few more contributers came on the project: Later on a few more contributers came on the project:

View File

@@ -1,30 +1,35 @@
# MARK: check minimal macOS requirement # MARK: 3 Arguments
# Start trapping the script
trap_with_arg func_trap SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM SIGTSTP
# check minimal macOS requirement
autoload is-at-least autoload is-at-least
installedOSversion=$(sw_vers -productVersion) installedOSversion=$(sw_vers -productVersion)
if ! is-at-least 10.14 $installedOSversion; then if ! is-at-least 10.14 $installedOSversion; then
printlog "Installomator requires at least macOS 10.14 Mojave." ERROR printlog "Installomator requires at least macOS 10.14 Mojave."
exit 98 exit 98
fi fi
# MARK: argument parsing # MARK: argument parsing
if [[ $# -eq 0 ]]; then if [[ $# -eq 0 ]]; then
if [[ -z $label ]]; then # check if label is set inside script if [[ -z $label ]]; then # check if label is set inside script
printlog "no label provided, printing labels" REQ 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\_-]*(\)|\|\\)$' "$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\_-]*(\)|\|\\)$' "${labelFile}" | tr -d ')|\' | grep -v -E '^(broken.*|longversion|version|valuesfromarguments)$' | sort
exit 0 exit 0
fi fi
elif [[ $1 == "/" ]]; then elif [[ $1 == "/" ]]; then
# jamf uses sends '/' as the first argument # jamf uses sends '/' as the first argument
printlog "shifting arguments for Jamf" REQ printlog "shifting arguments for Jamf"
shift 3 shift 3
fi fi
while [[ -n $1 ]]; do while [[ -n $1 ]]; do
if [[ $1 =~ ".*\=.*" ]]; then if [[ $1 =~ ".*\=.*" ]]; then
# if an argument contains an = character, send it to eval # if an argument contains an = character, send it to eval
printlog "setting variable from argument $1" WARN printlog "setting variable from argument $1"
eval $1 eval $1
else else
# assume it's a label # assume it's a label
@@ -96,33 +101,33 @@ currentUser=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print
# MARK: check for root # MARK: check for root
if [[ "$(whoami)" != "root" && "$DEBUG" -eq 0 ]]; then if [[ "$(whoami)" != "root" && "$DEBUG" -eq 0 ]]; then
# not running as root # not running as root
cleanupAndExit 6 "not running as root, exiting" ERROR cleanupAndExit 6 "not running as root, exiting"
fi fi
# MARK: labels in case statement # MARK: labels in case statement
case $label in case $label in
longversion) longversion)
# print the script version # print the script version
printlog "Installomater: version $VERSION ($VERSIONDATE)" REQ printlog "Installomater: version $VERSION ($VERSIONDATE)"
exit 0 exit 0
;; ;;
valuesfromarguments) valuesfromarguments)
if [[ -z $name ]]; then if [[ -z $name ]]; then
printlog "need to provide 'name'" ERROR printlog "need to provide 'name'"
exit 1 exit 1
fi fi
if [[ -z $type ]]; then if [[ -z $type ]]; then
printlog "need to provide 'type'" ERROR printlog "need to provide 'type'"
exit 1 exit 1
fi fi
if [[ -z $downloadURL ]]; then if [[ -z $downloadURL ]]; then
printlog "need to provide 'downloadURL'" ERROR printlog "need to provide 'downloadURL'"
exit 1 exit 1
fi fi
if [[ -z $expectedTeamID ]]; then if [[ -z $expectedTeamID ]]; then
printlog "need to provide 'expectedTeamID'" ERROR printlog "need to provide 'expectedTeamID'"
exit 1 exit 1
fi fi
;; ;;
# label descriptions start here # Mark: label descriptions start here

View File

@@ -1,4 +1,4 @@
# MARK: Functions # MARK: 2 Functions
cleanupAndExit() { # $1 = exit code, $2 message, $3 level cleanupAndExit() { # $1 = exit code, $2 message, $3 level
if [ -n "$dmgmount" ]; then if [ -n "$dmgmount" ]; then
@@ -18,10 +18,8 @@ cleanupAndExit() { # $1 = exit code, $2 message, $3 level
reopenClosedProcess reopenClosedProcess
if [[ -n $2 && $1 -ne 0 ]]; then if [[ -n $2 && $1 -ne 0 ]]; then
printlog "ERROR: $2" $3 printlog "ERROR: $2" $3
else
printlog "$2" $3
fi fi
printlog "################## End Installomator, exit code $1 \n" REQ printlog "################## End Installomator, exit code $1 \n\n" REQ
# if label is wrong and we wanted name of the label, then return ################## # if label is wrong and we wanted name of the label, then return ##################
if [[ $RETURN_LABEL_NAME -eq 1 ]]; then if [[ $RETURN_LABEL_NAME -eq 1 ]]; then
@@ -31,6 +29,17 @@ cleanupAndExit() { # $1 = exit code, $2 message, $3 level
exit "$1" exit "$1"
} }
# Two functions to trap the script
trap_with_arg() {
func="$1" ; shift
for sig ; do
trap "$func $sig" "$sig"
done
}
func_trap() {
cleanupAndExit 255 "Installomator has been terminated with: $1" ERROR
}
runAsUser() { runAsUser() {
if [[ $currentUser != "loginwindow" ]]; then if [[ $currentUser != "loginwindow" ]]; then
uid=$(id -u "$currentUser") uid=$(id -u "$currentUser")
@@ -156,10 +165,10 @@ downloadURLFromGit() { # $1 git user name, $2 git repo name
fi fi
if [ -n "$archiveName" ]; then if [ -n "$archiveName" ]; then
downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ 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; exit }")
else else
downloadURL=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" \ 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; exit }")
fi fi
if [ -z "$downloadURL" ]; then if [ -z "$downloadURL" ]; then
@@ -176,9 +185,9 @@ versionFromGit() {
gitusername=${1?:"no git user name"} gitusername=${1?:"no git user name"}
gitreponame=${2?:"no git repo name"} gitreponame=${2?:"no git repo name"}
appNewVersion=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g') 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 if [ -z "$appNewVersion" ]; then
printlog "could not retrieve version number for $gitusername/$gitreponame" WARN printlog "could not retrieve version number for $gitusername/$gitreponame"
appNewVersion="" appNewVersion=""
else else
echo "$appNewVersion" echo "$appNewVersion"
@@ -222,34 +231,19 @@ getAppVersion() {
fi fi
fi fi
# get app in targetDir, /Applications, or /Applications/Utilities # get app in /Applications, or /Applications/Utilities, or find using Spotlight
if [[ -d "$targetDir/$appName" ]]; then if [[ -d "/Applications/$appName" ]]; then
applist="$targetDir/$appName"
elif [[ -d "/Applications/$appName" ]]; then
applist="/Applications/$appName" applist="/Applications/$appName"
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# targetDir="/Applications"
# fi
elif [[ -d "/Applications/Utilities/$appName" ]]; then elif [[ -d "/Applications/Utilities/$appName" ]]; then
applist="/Applications/Utilities/$appName" applist="/Applications/Utilities/$appName"
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# targetDir="/Applications/Utilities"
# fi
else else
# applist=$(mdfind "kind:application $appName" -0 ) applist=$(mdfind "kind:application $appName" -0 )
printlog "name: $name, appName: $appName"
applist=$(mdfind "kind:application AND name:$name" -0 )
# printlog "App(s) found: ${applist}" DEBUG
# applist=$(mdfind "kind:application AND name:$appName" -0 )
fi fi
if [[ -z applist ]]; then if [[ -z applist ]]; then
printlog "No previous app found" INFO printlog "No previous app found" DEBUG
else else
printlog "App(s) found: ${applist}" INFO printlog "App(s) found: ${applist}" DEBUG
fi fi
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
# printlog "targetDir for installation: $targetDir" INFO
# fi
appPathArray=( ${(0)applist} ) appPathArray=( ${(0)applist} )
@@ -272,10 +266,10 @@ getAppVersion() {
fi fi
fi fi
else else
printlog "could not determine location of $appName" WARN printlog "could not determine location of $appName"
fi fi
else else
printlog "could not find $appName" WARN printlog "could not find $appName"
fi fi
} }
@@ -402,7 +396,7 @@ reopenClosedProcess() {
processuser=$(ps aux | grep -i "${appName}" | grep -vi "grep" | awk '{print $1}') processuser=$(ps aux | grep -i "${appName}" | grep -vi "grep" | awk '{print $1}')
printlog "Reopened ${appName} as $processuser" printlog "Reopened ${appName} as $processuser"
else else
printlog "App not closed, so no reopen." INFO printlog "App not closed, so no reopen." DEBUG
fi fi
} }
@@ -412,7 +406,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# check if app exists # check if app exists
if [ ! -e "$appPath" ]; then if [ ! -e "$appPath" ]; then
cleanupAndExit 8 "could not find: $appPath" ERROR cleanupAndExit 8 "could not find: $appPath" DEBUG
fi fi
# verify with spctl # verify with spctl
@@ -444,12 +438,10 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No new version to install" REG cleanupAndExit 0 "No new version to install" INFO
else else
printlog "Using force to install anyway." printlog "Using force to install anyway."
fi fi
elif [[ -z $appversion ]]; then
printlog "Installing $name version $appNewVersion on versionKey $versionKey."
else else
printlog "Downloaded version of $name is $appNewVersion on versionKey $versionKey (replacing version $appversion)." printlog "Downloaded version of $name is $appNewVersion on versionKey $versionKey (replacing version $appversion)."
fi fi
@@ -465,7 +457,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
printlog "notifying" printlog "notifying"
displaynotification "$message" "Error updating $name!" displaynotification "$message" "Error updating $name!"
fi fi
cleanupAndExit 6 "Installed macOS is too old for this app." ERROR cleanupAndExit 6 "Installed macOS is too old for this app." INFO
fi fi
fi fi
@@ -486,7 +478,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# remove existing application # remove existing application
if [ -e "$targetDir/$appName" ]; then if [ -e "$targetDir/$appName" ]; then
printlog "Removing existing $targetDir/$appName" WARN printlog "Removing existing $targetDir/$appName" DEBUG
deleteAppOut=$(rm -Rfv "$targetDir/$appName" 2>&1) deleteAppOut=$(rm -Rfv "$targetDir/$appName" 2>&1)
tempName="$targetDir/$appName" tempName="$targetDir/$appName"
tempNameLength=$((${#tempName} + 10)) tempNameLength=$((${#tempName} + 10))
@@ -497,21 +489,16 @@ installAppWithPath() { # $1: path to app to install in $targetDir
# copy app to /Applications # copy app to /Applications
printlog "Copy $appPath to $targetDir" printlog "Copy $appPath to $targetDir"
copyAppOut=$(ditto -v "$appPath" "$targetDir/$appName" 2>&1) if ! ditto "$appPath" "$targetDir/$appName"; then
copyAppStatus=$(echo $?) cleanupAndExit 7 "Error while copying" ERROR
deduplicatelogs "$copyAppOut"
printlog "Debugging enabled, App copy output was:\n$logoutput" DEBUG
if [[ $copyAppStatus -ne 0 ]] ; then
#if ! ditto "$appPath" "$targetDir/$appName"; then
cleanupAndExit 7 "Error while copying:\n$logoutput" ERROR
fi fi
# set ownership to current user # set ownership to current user
if [[ "$currentUser" != "loginwindow" && $SYSTEMOWNER -ne 1 ]]; then if [[ "$currentUser" != "loginwindow" && $SYSTEMOWNER -ne 1 ]]; then
printlog "Changing owner to $currentUser" WARN printlog "Changing owner to $currentUser"
chown -R "$currentUser" "$targetDir/$appName" chown -R "$currentUser" "$targetDir/$appName"
else else
printlog "No user logged in or SYSTEMOWNER=1, setting owner to root:wheel" WARN printlog "No user logged in or SYSTEMOWNER=1, setting owner to root:wheel"
chown -R root:wheel "$targetDir/$appName" chown -R root:wheel "$targetDir/$appName"
fi fi
@@ -609,7 +596,7 @@ installFromPKG() {
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No new version to install" REQ cleanupAndExit 0 "No new version to install" INFO
else else
printlog "Using force to install anyway." printlog "Using force to install anyway."
fi fi
@@ -683,28 +670,27 @@ installPkgInDmg() {
if [[ -z $pkgName ]]; then if [[ -z $pkgName ]]; then
# find first file ending with 'pkg' # find first file ending with 'pkg'
findfiles=$(find "$dmgmount" -iname "*.pkg" -type f -maxdepth 1 ) findfiles=$(find "$dmgmount" -iname "*.pkg" -type f -maxdepth 1 )
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg in dmg $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg in dmg $archiveName" ERROR
fi fi
archiveName="${filearray[1]}" archiveName="${filearray[1]}"
printlog "found pkg: $archiveName"
else else
if [[ -s "$dmgmount/$pkgName" ]] ; then # was: $tmpDir if ls "$tmpDir/$pkgName" ; then
archiveName="$dmgmount/$pkgName" archiveName="$tmpDir/$pkgName"
else else
# try searching for pkg # try searching for pkg
findfiles=$(find "$dmgmount" -iname "$pkgName") # was: $tmpDir findfiles=$(find "$tmpDir" -iname "$pkgName")
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg “$pkgName” in dmg $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg “$pkgName” in zip $archiveName" ERROR
fi fi
# it is now safe to overwrite archiveName for installFromPKG # it is now safe to overwrite archiveName for installFromPKG
archiveName="${filearray[1]}" archiveName="${filearray[1]}"
printlog "found pkg: $archiveName"
fi fi
fi fi
printlog "found pkg: $archiveName"
# installFromPkgs # installFromPkgs
installFromPKG installFromPKG
@@ -719,7 +705,6 @@ installPkgInZip() {
if [[ -z $pkgName ]]; then if [[ -z $pkgName ]]; then
# find first file ending with 'pkg' # find first file ending with 'pkg'
findfiles=$(find "$tmpDir" -iname "*.pkg" -type f -maxdepth 2 ) findfiles=$(find "$tmpDir" -iname "*.pkg" -type f -maxdepth 2 )
printlog "Found pkg(s):\n$findfiles" DEBUG
filearray=( ${(f)findfiles} ) filearray=( ${(f)findfiles} )
if [[ ${#filearray} -eq 0 ]]; then if [[ ${#filearray} -eq 0 ]]; then
cleanupAndExit 20 "couldn't find pkg in zip $archiveName" ERROR cleanupAndExit 20 "couldn't find pkg in zip $archiveName" ERROR
@@ -796,13 +781,13 @@ runUpdateTool() {
printlog "Error running $updateTool, Procceding with normal installation. Exit Status: $updateStatus Error:\n$logoutput" WARN printlog "Error running $updateTool, Procceding with normal installation. Exit Status: $updateStatus Error:\n$logoutput" WARN
return 1 return 1
if [[ $type == updateronly ]]; then if [[ $type == updateronly ]]; then
cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" ERROR cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" WARN
fi fi
elif [[ $updateStatus -eq 0 ]]; then elif [[ $updateStatus -eq 0 ]]; then
printlog "Debugging enabled, update tool output was:\n$logoutput" DEBUG printlog "Debugging enabled, update tool output was:\n$logoutput" DEBUG
fi fi
else else
printlog "couldn't find $updateTool, continuing normally" WARN printlog "couldn't find $updateTool, continuing normally"
return 1 return 1
fi fi
return 0 return 0
@@ -819,7 +804,7 @@ finishing() {
message="Installed $name, version $appversion" message="Installed $name, version $appversion"
fi fi
printlog "$message" REQ printlog "$message"
if [[ $currentUser != "loginwindow" && ( $NOTIFY == "success" || $NOTIFY == "all" ) ]]; then if [[ $currentUser != "loginwindow" && ( $NOTIFY == "success" || $NOTIFY == "all" ) ]]; then
printlog "notifying" printlog "notifying"

View File

@@ -80,7 +80,6 @@ LOGO=appstore
# - mosyleb Mosyle Business # - mosyleb Mosyle Business
# - mosylem Mosyle Manager (Education) # - mosylem Mosyle Manager (Education)
# - addigy Addigy # - addigy Addigy
# - microsoft Microsoft Endpoint Manager (Intune)
# path can also be set in the command call, and if file exists, it will be used. # 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"' # Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
# (spaces have to be escaped). # (spaces have to be escaped).

View File

@@ -1,9 +0,0 @@
1passwordcli)
name="1Password CLI"
type="pkg"
#packageID="com.1password.op"
downloadURL=$(curl -fs https://app-updates.agilebits.com/product_history/CLI | grep -m 1 -i op_apple_universal | cut -d'"' -f 2)
appNewVersion=$(echo $downloadURL | sed -E 's/.*\/[a-zA-Z_]*([0-9.]*)\..*/\1/g')
appCustomVersion(){ /usr/local/bin/op -v }
expectedTeamID="2BUA8C4S2C"
;;

View File

@@ -1,7 +0,0 @@
amazoncorretto8jdk)
name="Amazon Corretto 8 JDK"
type="pkg"
downloadURL="https://corretto.aws/downloads/latest/amazon-corretto-8-x64-macos-jdk.pkg"
appNewVersion=$(curl -s https://raw.githubusercontent.com/corretto/corretto-8/develop/CHANGELOG.md | grep "## Corretto version" | head -n 1 | awk '{ print $4; exit}')
expectedTeamID="94KV3E626L"
;;

View File

@@ -1,7 +1,7 @@
appcleaner) appcleaner)
# credit: Tadayuki Onishi (@kenchan0130)
name="AppCleaner" name="AppCleaner"
type="zip" type="zip"
downloadURL=$(curl -fs https://freemacsoft.net/appcleaner/Updates.xml | xpath '//rss/channel/item[last()]/enclosure/@url' 2>/dev/null | tr " " "\n" | sort | tail -1 | cut -d '"' -f 2) 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)
appNewVersion=$(curl -fsL "https://freemacsoft.net/appcleaner/Updates.xml" | xpath '//rss/channel/item[last()]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="X85ZX835W9" expectedTeamID="X85ZX835W9"
;; ;;

View File

@@ -1,10 +0,0 @@
autodeskfusion360admininstall)
name="Autodesk Fusion 360 Admin Install"
type="pkg"
packageID="com.autodesk.edu.fusion360"
downloadURL="https://dl.appstreaming.autodesk.com/production/installers/Autodesk%20Fusion%20360%20Admin%20Install.pkg"
appNewVersion=$(curl -fs "https://dl.appstreaming.autodesk.com/production/97e6dd95735340d6ad6e222a520454db/73e72ada57b7480280f7a6f4a289729f/full.json" | sed -E 's/.*build-version":"([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+).*/\1/g')
expectedTeamID="XXKJ396S2Y"
appName="Autodesk Fusion 360.app"
blockingProcesses=( "Autodesk Fusion 360" "Fusion 360" )
;;

View File

@@ -1,14 +0,0 @@
axurerp10)
name="Axure RP 10"
type="dmg"
if [[ $(arch) == "arm64" ]]; then
downloadURL="https://d3uii9pxdigrx1.cloudfront.net/AxureRP-Setup-arm64.dmg"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://d3uii9pxdigrx1.cloudfront.net/AxureRP-Setup.dmg"
fi
appNewVersion=$( curl -sL https://www.axure.com/release-history | grep -Eo '[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}' -m 1 )
expectedTeamID="HUMW6UU796"
versionKey="CFBundleVersion"
appName="Axure RP 10.app"
blockingProcesses=( "Axure RP 10" )
;;

View File

@@ -1,7 +0,0 @@
calcservice)
name="CalcService"
type="zip"
downloadURL="$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15" "https://www.devontechnologies.com/support/download" | tr '"' "\n" | grep -o "http.*download.*.zip" | grep -i calcservice | head -1)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;

View File

@@ -1,7 +0,0 @@
clipy)
name="Clipy"
type="dmg"
downloadURL=$(downloadURLFromGit Clipy Clipy)
appNewVersion=$(versionFromGit Clipy Clipy)
expectedTeamID="BBCHAJ584H"
;;

View File

@@ -1,13 +1,7 @@
dbeaverce) dbeaverce)
name="DBeaver" name="DBeaver"
type="dmg" type="dmg"
if [[ $(arch) == "arm64" ]]; then downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg"
downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos-aarch64.dmg"
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^location | sed 's/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/' | head -1)"
elif [[ $(arch) == "i386" ]]; then
downloadURL="https://dbeaver.io/files/dbeaver-ce-latest-macos.dmg"
appNewVersion="$(curl -fsIL "${downloadURL}" | grep -i ^location | sed 's/^.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\).*$/\1/' | head -1)"
fi
expectedTeamID="42B6MDKMW8" expectedTeamID="42B6MDKMW8"
blockingProcesses=( dbeaver ) blockingProcesses=( dbeaver )
;; ;;

View File

@@ -1,9 +1,8 @@
dialog|\ dialog)
swiftdialog)
name="Dialog" name="Dialog"
type="pkg" type="pkg"
packageID="au.csiro.dialogcli" packageID="au.csiro.dialogcli"
downloadURL="$(downloadURLFromGit bartreardon swiftDialog)" downloadURL="$(downloadURLFromGit bartreardon Dialog)"
appNewVersion="$(versionFromGit bartreardon swiftDialog)" appNewVersion="$(versionFromGit bartreardon Dialog)"
expectedTeamID="PWA5E9TQ59" expectedTeamID="PWA5E9TQ59"
;; ;;

View File

@@ -1,9 +0,0 @@
dockutil)
name="dockutil"
type="pkg"
packageID="dockutil.cli.tool"
downloadURL=$(downloadURLFromGit "kcrawford" "dockutil")
appNewVersion=$(versionFromGit "kcrawford" "dockutil")
expectedTeamID="Z5J8CJBUWC"
blockingProcesses=( NONE )
;;

View File

@@ -1,7 +0,0 @@
easyfind)
name="EasyFind"
type="zip"
downloadURL="$(curl -fs "https://www.devontechnologies.com/apps/freeware" | grep -o "http.*download.*.zip" | grep -i easyfind)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;

View File

@@ -1,9 +0,0 @@
forticlient_ztna)
name="FortiClient ZTNA"
type="pkgInDmg"
pkgName="Install.mpkg"
packageID="com.fortinet.forticlient."
downloadURL="https://links.fortinet.com/forticlient/mac/fabricagent"
appNewVersion="$(curl -fsL "$downloadURL" --remote-header-name --remote-name -w "%{url_effective}\n" -r 0-0 | cut -d "_" -f2)"
expectedTeamID="AH4XFXJ7DK"
;;

View File

@@ -1,7 +1,14 @@
googlechrome) googlechrome)
name="Google Chrome" name="Google Chrome"
type="dmg" type="dmg"
downloadURL="https://dl.google.com/chrome/mac/universal/stable/GGRO/googlechrome.dmg" if [[ $(arch) != "i386" ]]; then
appNewVersion=$(curl -s https://omahaproxy.appspot.com/history | awk -F',' '/mac_arm64,stable/{print $3; exit}') 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}')
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}')
fi
expectedTeamID="EQHXZ8M8AV" expectedTeamID="EQHXZ8M8AV"
;; ;;

View File

@@ -1,9 +0,0 @@
grammarly)
name="Grammarly Desktop"
type="dmg"
packageID="com.grammarly.ProjectLlama"
downloadURL=$(curl -fsL "https://download-mac.grammarly.com/appcast.xml" | xpath '//rss/channel/item[1]/enclosure/@url' 2>/dev/null | cut -d '"' -f 2)
expectedTeamID="W8F64X92K3"
appNewVersion=$(curl -is "https://download-mac.grammarly.com/appcast.xml" | grep sparkle:version | tr ',' '\n' | grep sparkle:version | cut -d '"' -f 4)
appName="Grammarly Installer.app"
;;

View File

@@ -1,7 +0,0 @@
houdahspot)
name="HoudahSpot"
type="zip"
downloadURL="$(curl -fs https://www.houdah.com/houdahSpot/updates/cast6.php | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
appNewVersion="$(curl -fs https://www.houdah.com/houdahSpot/updates/cast6.php | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
expectedTeamID="DKGQD8H8ZY"
;;

View File

@@ -2,11 +2,7 @@ loom)
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack) # credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
name="Loom" name="Loom"
type="dmg" type="dmg"
if [[ $(arch) == "arm64" ]]; then 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)
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/ && /arm64/ && /dmg/ {print $3}' | head -1)
elif [[ $(arch) == "i386" ]]; then
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)
fi
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}' ) 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" expectedTeamID="QGD2ZPXZZG"
;; ;;

View File

@@ -1,9 +0,0 @@
macadminspython)
name="MacAdmins Python"
type="pkg"
packageID="org.macadmins.python.recommended"
downloadURL=$(curl --silent --fail "https://api.github.com/repos/macadmins/python/releases/latest" | awk -F '"' "/browser_download_url/ && /python_recommended_signed/ { print \$4; exit }")
appNewVersion=$(grep -o -E '\d+\.\d+\.\d+\.\d+' <<< $downloadURL | head -n 1)
expectedTeamID="9GQZ7KUFR6"
blockingProcesses=( NONE )
;;

View File

@@ -1,10 +0,0 @@
microsoftazuredatastudio|\
azuredatastudio)
name="Azure Data Studio"
type="zip"
downloadURL=$( curl -sL https://github.com/microsoft/azuredatastudio/releases/latest | grep 'macOS ZIP' | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" )
appNewVersion=$(versionFromGit microsoft azuredatastudio )
expectedTeamID="UBF8T346G9"
appName="Azure Data Studio.app"
blockingProcesses=( "Azure Data Studio" )
;;

View File

@@ -1,6 +1,5 @@
microsoftdefender|\
microsoftdefenderatp) microsoftdefenderatp)
name="Microsoft Defender" name="Microsoft Defender ATP"
type="pkg" type="pkg"
downloadURL="https://go.microsoft.com/fwlink/?linkid=2097502" 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/<version>([0-9.]*) .*/\1/') appNewVersion=$(curl -fs https://macadmins.software/latest.xml | xpath '//latest/package[id="com.microsoft.defender.standalone"]/version' 2>/dev/null | sed -E 's/<version>([0-9.]*) .*/\1/')

View File

@@ -1,9 +0,0 @@
propresenter7)
name="ProPresenter 7"
appName="ProPresenter.app"
type="zip"
blockingProcesses="ProPresenter"
downloadURL=$(curl -s "https://api.renewedvision.com/v1/pro/upgrade?platform=macos&osVersion=12&appVersion=771&buildNumber=117899527&includeNotes=false" | grep -Eo '"downloadUrl":.*?[^\]",' | head -n 1 | cut -d \" -f 4 | sed -e 's/\\//g')
appNewVersion=$(curl -s "https://api.renewedvision.com/v1/pro/upgrade?platform=macos&osVersion=12&appVersion=771&buildNumber=117899527&includeNotes=false" | grep -Eo '"version":.*?[^\]",' | head -n 1 | cut -d \" -f 4)
expectedTeamID="97GAAZ6CPX"
;;

View File

@@ -1,12 +1,8 @@
ringcentralapp) ringcentralapp)
# credit: Isaac Ordonez, Mann consulting (@mannconsulting) # credit: Isaac Ordonez, Mann consulting (@mannconsulting)
name="Ringcentral" name="Glip"
type="pkg" type="dmg"
if [[ $(arch) != "i386" ]]; then downloadURL="https://downloads.ringcentral.com/glip/rc/GlipForMac"
downloadURL="https://app.ringcentral.com/download/RingCentral-arm64.pkg"
else
downloadURL="https://app.ringcentral.com/download/RingCentral.pkg"
fi
expectedTeamID="M932RC5J66" expectedTeamID="M932RC5J66"
blockingProcesses=( "Ringcentral" ) blockingProcesses=( "Glip" )
;; ;;

View File

@@ -1,10 +1,9 @@
supportapp) supportapp)
# credit: Søren Theilgaard (@theilgaard)
name="Support" name="Support"
type="pkg" type="pkg"
packageID="nl.root3.support" packageID="nl.root3.support"
downloadURL=$(downloadURLFromGit root3nl SupportApp) downloadURL=$(downloadURLFromGit root3nl SupportApp)
appNewVersion=$(versionFromGit root3nl SupportApp) appNewVersion=$(versionFromGit root3nl SupportApp)
expectedTeamID="98LJ4XBGYK" expectedTeamID="98LJ4XBGYK"
uid=$(id -u "$currentUser")
launchctl bootout gui/${uid} "/Library/LaunchAgents/nl.root3.support.plist"
;; ;;

View File

@@ -1,7 +0,0 @@
tembo)
name="Tembo"
type="zip"
downloadURL="$(curl -fs https://www.houdah.com/tembo/updates/cast2.xml | xpath '(//rss/channel/item/enclosure/@url)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
appNewVersion="$(curl -fs https://www.houdah.com/tembo/updates/cast2.xml | xpath '(//rss/channel/item/enclosure/@sparkle:shortVersionString)[1]' 2>/dev/null | head -1 | cut -d '"' -f 2)"
expectedTeamID="DKGQD8H8ZY"
;;

View File

@@ -1,8 +0,0 @@
wordservice)
name="WordService"
type="zip"
downloadURL="$(curl -fs -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15" "https://www.devontechnologies.com/support/download" | tr '"' "\n" | grep -o "http.*download.*.zip" | grep -i wordservice | head -1)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
appNewVersion=""
expectedTeamID="679S2QUWR8"
;;

View File

@@ -1,8 +0,0 @@
xmenu)
name="XMenu"
type="zip"
downloadURL="$(curl -fs "https://www.devontechnologies.com/apps/freeware" | grep -o "http.*download.*.zip" | grep -i xmenu)"
appNewVersion="$(echo $downloadURL | sed -E 's/.*\/([0-9.]*)\/.*/\1/g')"
expectedTeamID="679S2QUWR8"
;;

View File

@@ -4,5 +4,4 @@ zoom)
downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg" downloadURL="https://zoom.us/client/latest/ZoomInstallerIT.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)" appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
expectedTeamID="BJ4HAAB9B3" expectedTeamID="BJ4HAAB9B3"
versionKey="CFBundleVersion"
;; ;;

View File

@@ -4,5 +4,4 @@ zoomgov)
downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg" downloadURL="https://www.zoomgov.com/client/latest/ZoomInstallerIT.pkg"
appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)" appNewVersion="$(curl -fsIL ${downloadURL} | grep -i ^location | cut -d "/" -f5)"
expectedTeamID="BJ4HAAB9B3" expectedTeamID="BJ4HAAB9B3"
versionKey="CFBundleVersion"
;; ;;

View File

@@ -1,13 +1,14 @@
# Mark: 4 Main
*) *)
# unknown label # unknown label
#printlog "unknown label $label" #printlog "unknown label $label"
cleanupAndExit 1 "unknown label $label" ERROR cleanupAndExit 1 "unknown label $label"
;; ;;
esac esac
# Are we only asked to return label name # Are we only asked to return label name
if [[ $RETURN_LABEL_NAME -eq 1 ]]; then if [[ $RETURN_LABEL_NAME -eq 1 ]]; then
printlog "Only returning label name." REQ printlog "Only returning label name."
printlog "$name" printlog "$name"
echo "$name" echo "$name"
exit exit
@@ -18,7 +19,7 @@ fi
if [[ ${INTERRUPT_DND} = "no" ]]; then if [[ ${INTERRUPT_DND} = "no" ]]; then
# Check if a fullscreen app is active # Check if a fullscreen app is active
if hasDisplaySleepAssertion; then if hasDisplaySleepAssertion; then
cleanupAndExit 1 "active display sleep assertion detected, aborting" ERROR cleanupAndExit 1 "active display sleep assertion detected, aborting"
fi fi
fi fi
@@ -55,11 +56,6 @@ case $LOGO in
LOGO="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns" LOGO="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
if [[ -z $MDMProfileName ]]; then; MDMProfileName="MDM Profile"; fi if [[ -z $MDMProfileName ]]; then; MDMProfileName="MDM Profile"; fi
;; ;;
microsoft)
# Microsoft Endpoint Manager (Intune)
LOGO="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
if [[ -z $MDMProfileName ]]; then; MDMProfileName="Management Profile"; fi
;;
esac esac
if [[ ! -a "${LOGO}" ]]; then if [[ ! -a "${LOGO}" ]]; then
if [[ $(sw_vers -buildVersion) > "19" ]]; then if [[ $(sw_vers -buildVersion) > "19" ]]; then
@@ -68,9 +64,9 @@ if [[ ! -a "${LOGO}" ]]; then
LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns" LOGO="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
fi fi
fi fi
printlog "LOGO=${LOGO}" INFO printlog "LOGO=${LOGO}"
printlog "Label type: $type" INFO printlog "Label type: $type"
# MARK: extract info from data # MARK: extract info from data
if [ -z "$archiveName" ]; then if [ -z "$archiveName" ]; then
@@ -92,7 +88,7 @@ if [ -z "$archiveName" ]; then
;; ;;
esac esac
fi fi
printlog "archiveName: $archiveName" INFO printlog "archiveName: $archiveName" DEBUG
if [ -z "$appName" ]; then if [ -z "$appName" ]; then
# when not given derive from name # when not given derive from name
@@ -110,13 +106,14 @@ if [ -z "$targetDir" ]; then
updateronly) updateronly)
;; ;;
*) *)
cleanupAndExit 99 "Cannot handle type $type" ERROR printlog "Cannot handle type $type"
cleanupAndExit 99
;; ;;
esac esac
fi fi
if [[ -z $blockingProcesses ]]; then if [[ -z $blockingProcesses ]]; then
printlog "no blocking processes defined, using $name as default" INFO printlog "no blocking processes defined, using $name as default"
blockingProcesses=( $name ) blockingProcesses=( $name )
fi fi
@@ -132,7 +129,8 @@ fi
# MARK: change directory to temporary working directory # MARK: change directory to temporary working directory
printlog "Changing directory to $tmpDir" DEBUG printlog "Changing directory to $tmpDir" DEBUG
if ! cd "$tmpDir"; then if ! cd "$tmpDir"; then
cleanupAndExit 1 "error changing directory $tmpDir" ERROR printlog "error changing directory $tmpDir"
cleanupAndExit 1
fi fi
# MARK: get installed version # MARK: get installed version
@@ -155,10 +153,10 @@ if [[ -n $appNewVersion ]]; then
printlog "notifying" printlog "notifying"
displaynotification "$message" "No update for $name!" displaynotification "$message" "No update for $name!"
fi fi
cleanupAndExit 0 "No newer version." REQ cleanupAndExit 0 "No newer version."
fi fi
else else
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app." WARN printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app."
fi fi
fi fi
else else
@@ -171,12 +169,13 @@ if [[ (-n $appversion && -n "$updateTool") || "$type" == "updateronly" ]]; then
if [[ $DEBUG -ne 1 ]]; then if [[ $DEBUG -ne 1 ]]; then
if runUpdateTool; then if runUpdateTool; then
finishing finishing
cleanupAndExit 0 "updateTool has run" REQ cleanupAndExit 0
elif [[ $type == "updateronly" ]];then elif [[ $type == "updateronly" ]];then
cleanupAndExit 0 "type is $type so we end here." REQ printlog "type is $type so we end here."
cleanupAndExit 0
fi # otherwise continue fi # otherwise continue
else else
printlog "DEBUG mode 1 enabled, not running update tool" WARN printlog "DEBUG mode 1 enabled, not running update tool"
fi fi
fi fi
@@ -199,14 +198,14 @@ else
deduplicatelogs "$curlDownload" deduplicatelogs "$curlDownload"
if [[ $curlDownloadStatus -ne 0 ]]; then if [[ $curlDownloadStatus -ne 0 ]]; then
#if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then #if ! curl --location --fail --silent "$downloadURL" -o "$archiveName"; then
printlog "error downloading $downloadURL" ERROR printlog "error downloading $downloadURL"
message="$name update/installation failed. This will be logged, so IT can follow up." message="$name update/installation failed. This will be logged, so IT can follow up."
if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then if [[ $currentUser != "loginwindow" && $NOTIFY == "all" ]]; then
printlog "notifying" printlog "notifying"
if [[ $updateDetected == "YES" ]]; then if [[ $updateDetected == "YES" ]]; then
displaynotification "$message" "Error updating $name" displaynotification "$message" "Error updating $name" ERROR
else else
displaynotification "$message" "Error installing $name" displaynotification "$message" "Error installing $name" ERROR
fi fi
fi fi
printlog "File list: $(ls -lh "$archiveName")" ERROR printlog "File list: $(ls -lh "$archiveName")" ERROR
@@ -271,7 +270,8 @@ case $type in
installAppInDmgInZip installAppInDmgInZip
;; ;;
*) *)
cleanupAndExit 99 "Cannot handle type $type" ERROR printlog "Cannot handle type $type"
cleanupAndExit 99
;; ;;
esac esac
@@ -279,4 +279,4 @@ esac
finishing finishing
# all done! # all done!
cleanupAndExit 0 "All done!" REQ cleanupAndExit 0

View File

@@ -1 +1 @@
10dev 9.1beta