mirror of
https://github.com/mtan93/Installomator.git
synced 2026-03-15 13:20:58 +00:00
Compare commits
1 Commits
FortiClien
...
cleanupAnd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b42bd7e408 |
43
CHANGELOG.md
43
CHANGELOG.md
@@ -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
|
||||||
|
|
||||||
|
|||||||
340
Installomator.sh
340
Installomator.sh
@@ -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
|
||||||
|
|||||||
20
Labels.txt
20
Labels.txt
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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).
|
||||||
|
|||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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" )
|
|
||||||
;;
|
|
||||||
@@ -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" )
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
clipy)
|
|
||||||
name="Clipy"
|
|
||||||
type="dmg"
|
|
||||||
downloadURL=$(downloadURLFromGit Clipy Clipy)
|
|
||||||
appNewVersion=$(versionFromGit Clipy Clipy)
|
|
||||||
expectedTeamID="BBCHAJ584H"
|
|
||||||
;;
|
|
||||||
@@ -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 )
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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 )
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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 )
|
|
||||||
;;
|
|
||||||
@@ -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" )
|
|
||||||
;;
|
|
||||||
@@ -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/')
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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" )
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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"
|
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
@@ -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"
|
|
||||||
;;
|
|
||||||
|
|
||||||
@@ -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"
|
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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"
|
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
10dev
|
9.1beta
|
||||||
|
|||||||
Reference in New Issue
Block a user