mirror of
https://github.com/mtan93/Installomator.git
synced 2026-03-29 22:04:09 +01:00
Merge branch 'main' into Variable-for-skipping-if-app-is-not-installed
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
## v10
|
## v9.1
|
||||||
|
|
||||||
- Introducing variable `SKIP_UNINSTALLED` that normally will be `0` and the script will run and install the software label if other conditions align with this. Use `SKIP_UNINSTALLED=1` to have the script stop if a current installation of the app is not found.
|
- Introducing variable `SKIP_UNINSTALLED` that normally will be `0` and the script will run and install the software label if other conditions align with this. Use `SKIP_UNINSTALLED=1` to have the script stop if a current installation of the app is not found.
|
||||||
-
|
|
||||||
|
|
||||||
## v9
|
## v9
|
||||||
|
|
||||||
|
|||||||
149
Installomator.sh
149
Installomator.sh
@@ -301,8 +301,8 @@ if [[ $(/usr/bin/arch) == "arm64" ]]; then
|
|||||||
rosetta2=no
|
rosetta2=no
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
VERSION="9.0"
|
VERSION="9.0.1"
|
||||||
VERSIONDATE="2022-02-08"
|
VERSIONDATE="2022-02-20"
|
||||||
|
|
||||||
# MARK: Functions
|
# MARK: Functions
|
||||||
|
|
||||||
@@ -324,8 +324,10 @@ 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\n" REQ
|
printlog "################## End Installomator, exit code $1 \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
|
||||||
@@ -403,7 +405,7 @@ printlog(){
|
|||||||
curl -s -X POST https://http-intake.logs.datadoghq.com/v1/input -H "Content-Type: text/plain" -H "DD-API-KEY: $datadogAPI" -d "${log_priority} : $mdmURL : Installomator-${label} : ${VERSIONDATE//-/} : $SESSION : ${logmessage}" > /dev/null
|
curl -s -X POST https://http-intake.logs.datadoghq.com/v1/input -H "Content-Type: text/plain" -H "DD-API-KEY: $datadogAPI" -d "${log_priority} : $mdmURL : Installomator-${label} : ${VERSIONDATE//-/} : $SESSION : ${logmessage}" > /dev/null
|
||||||
done <<< "$log_message"
|
done <<< "$log_message"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Extra spaces
|
# Extra spaces
|
||||||
space_char=""
|
space_char=""
|
||||||
if [[ ${#log_priority} -eq 3 ]]; then
|
if [[ ${#log_priority} -eq 3 ]]; then
|
||||||
@@ -482,7 +484,7 @@ versionFromGit() {
|
|||||||
|
|
||||||
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')
|
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"
|
printlog "could not retrieve version number for $gitusername/$gitreponame" WARN
|
||||||
appNewVersion=""
|
appNewVersion=""
|
||||||
else
|
else
|
||||||
echo "$appNewVersion"
|
echo "$appNewVersion"
|
||||||
@@ -526,19 +528,34 @@ getAppVersion() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# get app in /Applications, or /Applications/Utilities, or find using Spotlight
|
# get app in targetDir, /Applications, or /Applications/Utilities
|
||||||
if [[ -d "/Applications/$appName" ]]; then
|
if [[ -d "$targetDir/$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" DEBUG
|
printlog "No previous app found" INFO
|
||||||
else
|
else
|
||||||
printlog "App(s) found: ${applist}" DEBUG
|
printlog "App(s) found: ${applist}" INFO
|
||||||
fi
|
fi
|
||||||
|
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
|
||||||
|
# printlog "targetDir for installation: $targetDir" INFO
|
||||||
|
# fi
|
||||||
|
|
||||||
appPathArray=( ${(0)applist} )
|
appPathArray=( ${(0)applist} )
|
||||||
|
|
||||||
@@ -561,10 +578,10 @@ getAppVersion() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "could not determine location of $appName"
|
printlog "could not determine location of $appName" WARN
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "could not find $appName"
|
printlog "could not find $appName" WARN
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -691,7 +708,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." DEBUG
|
printlog "App not closed, so no reopen." INFO
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,7 +718,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" DEBUG
|
cleanupAndExit 8 "could not find: $appPath" ERROR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# verify with spctl
|
# verify with spctl
|
||||||
@@ -733,10 +750,12 @@ 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" INFO
|
cleanupAndExit 0 "No new version to install" WARN
|
||||||
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
|
||||||
@@ -752,7 +771,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." INFO
|
cleanupAndExit 6 "Installed macOS is too old for this app." ERROR
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -793,7 +812,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
|
|||||||
printlog "Changing owner to $currentUser"
|
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"
|
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
|
||||||
|
|
||||||
@@ -823,7 +842,7 @@ mountDMG() {
|
|||||||
dmgmountStatus=$(echo $?)
|
dmgmountStatus=$(echo $?)
|
||||||
dmgmount=$(echo $dmgmountOut | tail -n 1 | cut -c 54- )
|
dmgmount=$(echo $dmgmountOut | tail -n 1 | cut -c 54- )
|
||||||
deduplicatelogs "$dmgmountOut"
|
deduplicatelogs "$dmgmountOut"
|
||||||
|
|
||||||
if [[ $dmgmountStatus -ne 0 ]] ; then
|
if [[ $dmgmountStatus -ne 0 ]] ; then
|
||||||
#if ! dmgmount=$(echo 'Y'$'\n' | hdiutil attach "$tmpDir/$archiveName" -nobrowse -readonly | tail -n 1 | cut -c 54- ); then
|
#if ! dmgmount=$(echo 'Y'$'\n' | hdiutil attach "$tmpDir/$archiveName" -nobrowse -readonly | tail -n 1 | cut -c 54- ); then
|
||||||
cleanupAndExit 3 "Error mounting $tmpDir/$archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 3 "Error mounting $tmpDir/$archiveName error:\n$logoutput" ERROR
|
||||||
@@ -832,7 +851,7 @@ mountDMG() {
|
|||||||
cleanupAndExit 3 "Error accessing mountpoint for $tmpDir/$archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 3 "Error accessing mountpoint for $tmpDir/$archiveName error:\n$logoutput" ERROR
|
||||||
fi
|
fi
|
||||||
printlog "Debugging enabled, dmgmount output was:\n$logoutput" DEBUG
|
printlog "Debugging enabled, dmgmount output was:\n$logoutput" DEBUG
|
||||||
|
|
||||||
printlog "Mounted: $dmgmount" INFO
|
printlog "Mounted: $dmgmount" INFO
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -849,7 +868,7 @@ installFromPKG() {
|
|||||||
spctlOut=$(spctl -a -vv -t install "$archiveName" 2>&1 )
|
spctlOut=$(spctl -a -vv -t install "$archiveName" 2>&1 )
|
||||||
spctlStatus=$(echo $?)
|
spctlStatus=$(echo $?)
|
||||||
printlog "spctlOut is $spctlOut" DEBUG
|
printlog "spctlOut is $spctlOut" DEBUG
|
||||||
|
|
||||||
teamID=$(echo $spctlOut | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' )
|
teamID=$(echo $spctlOut | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' )
|
||||||
# Apple signed software has no teamID, grab entire origin instead
|
# Apple signed software has no teamID, grab entire origin instead
|
||||||
if [[ -z $teamID ]]; then
|
if [[ -z $teamID ]]; then
|
||||||
@@ -857,7 +876,7 @@ installFromPKG() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
deduplicatelogs "$spctlOut"
|
deduplicatelogs "$spctlOut"
|
||||||
|
|
||||||
if [[ $spctlStatus -ne 0 ]] ; then
|
if [[ $spctlStatus -ne 0 ]] ; then
|
||||||
#if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then
|
#if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then
|
||||||
cleanupAndExit 4 "Error verifying $archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 4 "Error verifying $archiveName error:\n$logoutput" ERROR
|
||||||
@@ -891,7 +910,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" INFO
|
cleanupAndExit 0 "No new version to install" WARN
|
||||||
else
|
else
|
||||||
printlog "Using force to install anyway."
|
printlog "Using force to install anyway."
|
||||||
fi
|
fi
|
||||||
@@ -965,27 +984,28 @@ 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 ls "$tmpDir/$pkgName" ; then
|
if [[ -s "$dmgmount/$pkgName" ]] ; then # was: $tmpDir
|
||||||
archiveName="$tmpDir/$pkgName"
|
archiveName="$dmgmount/$pkgName"
|
||||||
else
|
else
|
||||||
# try searching for pkg
|
# try searching for pkg
|
||||||
findfiles=$(find "$tmpDir" -iname "$pkgName")
|
findfiles=$(find "$dmgmount" -iname "$pkgName") # was: $tmpDir
|
||||||
|
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 zip $archiveName" ERROR
|
cleanupAndExit 20 "couldn't find pkg “$pkgName” in dmg $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
|
||||||
@@ -1000,6 +1020,7 @@ 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
|
||||||
@@ -1076,13 +1097,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" WARN
|
cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" ERROR
|
||||||
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"
|
printlog "couldn't find $updateTool, continuing normally" WARN
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
@@ -1150,21 +1171,21 @@ 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"
|
printlog "no label provided, printing labels" REQ
|
||||||
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"
|
printlog "shifting arguments for Jamf" REQ
|
||||||
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"
|
printlog "setting variable from argument $1" REQ
|
||||||
eval $1
|
eval $1
|
||||||
else
|
else
|
||||||
# assume it's a label
|
# assume it's a label
|
||||||
@@ -1236,31 +1257,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"
|
cleanupAndExit 6 "not running as root, exiting" ERROR
|
||||||
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)"
|
printlog "Installomater: version $VERSION ($VERSIONDATE)" REQ
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
valuesfromarguments)
|
valuesfromarguments)
|
||||||
if [[ -z $name ]]; then
|
if [[ -z $name ]]; then
|
||||||
printlog "need to provide 'name'"
|
printlog "need to provide 'name'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $type ]]; then
|
if [[ -z $type ]]; then
|
||||||
printlog "need to provide 'type'"
|
printlog "need to provide 'type'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $downloadURL ]]; then
|
if [[ -z $downloadURL ]]; then
|
||||||
printlog "need to provide 'downloadURL'"
|
printlog "need to provide 'downloadURL'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $expectedTeamID ]]; then
|
if [[ -z $expectedTeamID ]]; then
|
||||||
printlog "need to provide 'expectedTeamID'"
|
printlog "need to provide 'expectedTeamID'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -2795,7 +2816,11 @@ loom)
|
|||||||
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
|
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
|
||||||
name="Loom"
|
name="Loom"
|
||||||
type="dmg"
|
type="dmg"
|
||||||
downloadURL=https://cdn.loom.com/desktop-packages/$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/url/ && /dmg/ {print $3}' | head -1)
|
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/ && /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"
|
||||||
;;
|
;;
|
||||||
@@ -3494,6 +3519,15 @@ 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"
|
||||||
@@ -4605,13 +4639,13 @@ zulujdk8)
|
|||||||
*)
|
*)
|
||||||
# unknown label
|
# unknown label
|
||||||
#printlog "unknown label $label"
|
#printlog "unknown label $label"
|
||||||
cleanupAndExit 1 "unknown label $label"
|
cleanupAndExit 1 "unknown label $label" ERROR
|
||||||
;;
|
;;
|
||||||
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."
|
printlog "Only returning label name." REQ
|
||||||
printlog "$name"
|
printlog "$name"
|
||||||
echo "$name"
|
echo "$name"
|
||||||
exit
|
exit
|
||||||
@@ -4622,7 +4656,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"
|
cleanupAndExit 1 "active display sleep assertion detected, aborting" ERROR
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -4667,9 +4701,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}"
|
printlog "LOGO=${LOGO}" INFO
|
||||||
|
|
||||||
printlog "Label type: $type"
|
printlog "Label type: $type" INFO
|
||||||
|
|
||||||
# MARK: extract info from data
|
# MARK: extract info from data
|
||||||
if [ -z "$archiveName" ]; then
|
if [ -z "$archiveName" ]; then
|
||||||
@@ -4691,7 +4725,7 @@ if [ -z "$archiveName" ]; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
printlog "archiveName: $archiveName" DEBUG
|
printlog "archiveName: $archiveName" INFO
|
||||||
|
|
||||||
if [ -z "$appName" ]; then
|
if [ -z "$appName" ]; then
|
||||||
# when not given derive from name
|
# when not given derive from name
|
||||||
@@ -4709,14 +4743,13 @@ if [ -z "$targetDir" ]; then
|
|||||||
updateronly)
|
updateronly)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printlog "Cannot handle type $type"
|
cleanupAndExit 99 "Cannot handle type $type" ERROR
|
||||||
cleanupAndExit 99
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z $blockingProcesses ]]; then
|
if [[ -z $blockingProcesses ]]; then
|
||||||
printlog "no blocking processes defined, using $name as default"
|
printlog "no blocking processes defined, using $name as default" INFO
|
||||||
blockingProcesses=( $name )
|
blockingProcesses=( $name )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -4732,8 +4765,7 @@ 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
|
||||||
printlog "error changing directory $tmpDir"
|
cleanupAndExit 1 "error changing directory $tmpDir" ERROR
|
||||||
cleanupAndExit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# MARK: get installed version
|
# MARK: get installed version
|
||||||
@@ -4756,10 +4788,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."
|
cleanupAndExit 0 "No newer version." WARN
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app."
|
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app." WARN
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -4778,7 +4810,7 @@ if [[ (-n $appversion && -n "$updateTool") || "$type" == "updateronly" ]]; then
|
|||||||
cleanupAndExit 0
|
cleanupAndExit 0
|
||||||
fi # otherwise continue
|
fi # otherwise continue
|
||||||
else
|
else
|
||||||
printlog "DEBUG mode 1 enabled, not running update tool"
|
printlog "DEBUG mode 1 enabled, not running update tool" WARN
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -4801,14 +4833,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"
|
printlog "error downloading $downloadURL" ERROR
|
||||||
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" ERROR
|
displaynotification "$message" "Error updating $name"
|
||||||
else
|
else
|
||||||
displaynotification "$message" "Error installing $name" ERROR
|
displaynotification "$message" "Error installing $name"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
printlog "File list: $(ls -lh "$archiveName")" ERROR
|
printlog "File list: $(ls -lh "$archiveName")" ERROR
|
||||||
@@ -4873,8 +4905,7 @@ case $type in
|
|||||||
installAppInDmgInZip
|
installAppInDmgInZip
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printlog "Cannot handle type $type"
|
cleanupAndExit 99 "Cannot handle type $type" ERROR
|
||||||
cleanupAndExit 99
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -255,6 +255,7 @@ opera
|
|||||||
ottomatic
|
ottomatic
|
||||||
overflow
|
overflow
|
||||||
pacifist
|
pacifist
|
||||||
|
packages
|
||||||
pandoc
|
pandoc
|
||||||
paretosecurity
|
paretosecurity
|
||||||
parsec
|
parsec
|
||||||
|
|||||||
@@ -10,21 +10,21 @@ 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"
|
printlog "no label provided, printing labels" REQ
|
||||||
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"
|
printlog "shifting arguments for Jamf" REQ
|
||||||
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"
|
printlog "setting variable from argument $1" REQ
|
||||||
eval $1
|
eval $1
|
||||||
else
|
else
|
||||||
# assume it's a label
|
# assume it's a label
|
||||||
@@ -96,31 +96,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"
|
cleanupAndExit 6 "not running as root, exiting" ERROR
|
||||||
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)"
|
printlog "Installomater: version $VERSION ($VERSIONDATE)" REQ
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
valuesfromarguments)
|
valuesfromarguments)
|
||||||
if [[ -z $name ]]; then
|
if [[ -z $name ]]; then
|
||||||
printlog "need to provide 'name'"
|
printlog "need to provide 'name'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $type ]]; then
|
if [[ -z $type ]]; then
|
||||||
printlog "need to provide 'type'"
|
printlog "need to provide 'type'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $downloadURL ]]; then
|
if [[ -z $downloadURL ]]; then
|
||||||
printlog "need to provide 'downloadURL'"
|
printlog "need to provide 'downloadURL'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
if [[ -z $expectedTeamID ]]; then
|
if [[ -z $expectedTeamID ]]; then
|
||||||
printlog "need to provide 'expectedTeamID'"
|
printlog "need to provide 'expectedTeamID'" ERROR
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ 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\n" REQ
|
printlog "################## End Installomator, exit code $1 \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
|
||||||
@@ -97,7 +99,7 @@ printlog(){
|
|||||||
curl -s -X POST https://http-intake.logs.datadoghq.com/v1/input -H "Content-Type: text/plain" -H "DD-API-KEY: $datadogAPI" -d "${log_priority} : $mdmURL : Installomator-${label} : ${VERSIONDATE//-/} : $SESSION : ${logmessage}" > /dev/null
|
curl -s -X POST https://http-intake.logs.datadoghq.com/v1/input -H "Content-Type: text/plain" -H "DD-API-KEY: $datadogAPI" -d "${log_priority} : $mdmURL : Installomator-${label} : ${VERSIONDATE//-/} : $SESSION : ${logmessage}" > /dev/null
|
||||||
done <<< "$log_message"
|
done <<< "$log_message"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Extra spaces
|
# Extra spaces
|
||||||
space_char=""
|
space_char=""
|
||||||
if [[ ${#log_priority} -eq 3 ]]; then
|
if [[ ${#log_priority} -eq 3 ]]; then
|
||||||
@@ -176,7 +178,7 @@ versionFromGit() {
|
|||||||
|
|
||||||
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')
|
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"
|
printlog "could not retrieve version number for $gitusername/$gitreponame" WARN
|
||||||
appNewVersion=""
|
appNewVersion=""
|
||||||
else
|
else
|
||||||
echo "$appNewVersion"
|
echo "$appNewVersion"
|
||||||
@@ -220,23 +222,38 @@ getAppVersion() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# get app in /Applications, or /Applications/Utilities, or find using Spotlight
|
# get app in targetDir, /Applications, or /Applications/Utilities
|
||||||
if [[ -d "/Applications/$appName" ]]; then
|
if [[ -d "$targetDir/$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
|
||||||
if [[ $SKIP_UNINSTALLED -eq 1 ]]; then
|
if [[ $SKIP_UNINSTALLED -eq 1 ]]; then
|
||||||
cleanupAndExit 0 "No previous app found, and SKIP_UNINSTALLED=1." REQ
|
cleanupAndExit 0 "No previous app found, and SKIP_UNINSTALLED=1." REQ
|
||||||
else
|
else
|
||||||
printlog "No previous app found" DEBUG
|
printlog "No previous app found" DEBUG
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "App(s) found: ${applist}" DEBUG
|
printlog "App(s) found: ${applist}" INFO
|
||||||
fi
|
fi
|
||||||
|
# if [[ $type =~ '^(dmg|zip|tbz|app.*)$' ]]; then
|
||||||
|
# printlog "targetDir for installation: $targetDir" INFO
|
||||||
|
# fi
|
||||||
|
|
||||||
appPathArray=( ${(0)applist} )
|
appPathArray=( ${(0)applist} )
|
||||||
|
|
||||||
@@ -259,10 +276,10 @@ getAppVersion() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "could not determine location of $appName"
|
printlog "could not determine location of $appName" WARN
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "could not find $appName"
|
printlog "could not find $appName" WARN
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,7 +406,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." DEBUG
|
printlog "App not closed, so no reopen." INFO
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,7 +416,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" DEBUG
|
cleanupAndExit 8 "could not find: $appPath" ERROR
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# verify with spctl
|
# verify with spctl
|
||||||
@@ -431,10 +448,12 @@ 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" INFO
|
cleanupAndExit 0 "No new version to install" WARN
|
||||||
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
|
||||||
@@ -450,7 +469,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." INFO
|
cleanupAndExit 6 "Installed macOS is too old for this app." ERROR
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -491,7 +510,7 @@ installAppWithPath() { # $1: path to app to install in $targetDir
|
|||||||
printlog "Changing owner to $currentUser"
|
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"
|
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
|
||||||
|
|
||||||
@@ -521,7 +540,7 @@ mountDMG() {
|
|||||||
dmgmountStatus=$(echo $?)
|
dmgmountStatus=$(echo $?)
|
||||||
dmgmount=$(echo $dmgmountOut | tail -n 1 | cut -c 54- )
|
dmgmount=$(echo $dmgmountOut | tail -n 1 | cut -c 54- )
|
||||||
deduplicatelogs "$dmgmountOut"
|
deduplicatelogs "$dmgmountOut"
|
||||||
|
|
||||||
if [[ $dmgmountStatus -ne 0 ]] ; then
|
if [[ $dmgmountStatus -ne 0 ]] ; then
|
||||||
#if ! dmgmount=$(echo 'Y'$'\n' | hdiutil attach "$tmpDir/$archiveName" -nobrowse -readonly | tail -n 1 | cut -c 54- ); then
|
#if ! dmgmount=$(echo 'Y'$'\n' | hdiutil attach "$tmpDir/$archiveName" -nobrowse -readonly | tail -n 1 | cut -c 54- ); then
|
||||||
cleanupAndExit 3 "Error mounting $tmpDir/$archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 3 "Error mounting $tmpDir/$archiveName error:\n$logoutput" ERROR
|
||||||
@@ -530,7 +549,7 @@ mountDMG() {
|
|||||||
cleanupAndExit 3 "Error accessing mountpoint for $tmpDir/$archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 3 "Error accessing mountpoint for $tmpDir/$archiveName error:\n$logoutput" ERROR
|
||||||
fi
|
fi
|
||||||
printlog "Debugging enabled, dmgmount output was:\n$logoutput" DEBUG
|
printlog "Debugging enabled, dmgmount output was:\n$logoutput" DEBUG
|
||||||
|
|
||||||
printlog "Mounted: $dmgmount" INFO
|
printlog "Mounted: $dmgmount" INFO
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -547,7 +566,7 @@ installFromPKG() {
|
|||||||
spctlOut=$(spctl -a -vv -t install "$archiveName" 2>&1 )
|
spctlOut=$(spctl -a -vv -t install "$archiveName" 2>&1 )
|
||||||
spctlStatus=$(echo $?)
|
spctlStatus=$(echo $?)
|
||||||
printlog "spctlOut is $spctlOut" DEBUG
|
printlog "spctlOut is $spctlOut" DEBUG
|
||||||
|
|
||||||
teamID=$(echo $spctlOut | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' )
|
teamID=$(echo $spctlOut | awk -F '(' '/origin=/ {print $2 }' | tr -d '()' )
|
||||||
# Apple signed software has no teamID, grab entire origin instead
|
# Apple signed software has no teamID, grab entire origin instead
|
||||||
if [[ -z $teamID ]]; then
|
if [[ -z $teamID ]]; then
|
||||||
@@ -555,7 +574,7 @@ installFromPKG() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
deduplicatelogs "$spctlOut"
|
deduplicatelogs "$spctlOut"
|
||||||
|
|
||||||
if [[ $spctlStatus -ne 0 ]] ; then
|
if [[ $spctlStatus -ne 0 ]] ; then
|
||||||
#if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then
|
#if ! spctlout=$(spctl -a -vv -t install "$archiveName" 2>&1 ); then
|
||||||
cleanupAndExit 4 "Error verifying $archiveName error:\n$logoutput" ERROR
|
cleanupAndExit 4 "Error verifying $archiveName error:\n$logoutput" ERROR
|
||||||
@@ -589,7 +608,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" INFO
|
cleanupAndExit 0 "No new version to install" WARN
|
||||||
else
|
else
|
||||||
printlog "Using force to install anyway."
|
printlog "Using force to install anyway."
|
||||||
fi
|
fi
|
||||||
@@ -663,27 +682,28 @@ 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 ls "$tmpDir/$pkgName" ; then
|
if [[ -s "$dmgmount/$pkgName" ]] ; then # was: $tmpDir
|
||||||
archiveName="$tmpDir/$pkgName"
|
archiveName="$dmgmount/$pkgName"
|
||||||
else
|
else
|
||||||
# try searching for pkg
|
# try searching for pkg
|
||||||
findfiles=$(find "$tmpDir" -iname "$pkgName")
|
findfiles=$(find "$dmgmount" -iname "$pkgName") # was: $tmpDir
|
||||||
|
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 zip $archiveName" ERROR
|
cleanupAndExit 20 "couldn't find pkg “$pkgName” in dmg $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
|
||||||
@@ -698,6 +718,7 @@ 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
|
||||||
@@ -774,13 +795,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" WARN
|
cleanupAndExit 77 "No Download URL Set, this is an update only application and the updater failed" ERROR
|
||||||
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"
|
printlog "couldn't find $updateTool, continuing normally" WARN
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -2,7 +2,11 @@ loom)
|
|||||||
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
|
# credit: Lance Stephens (@pythoninthegrass on MacAdmins Slack)
|
||||||
name="Loom"
|
name="Loom"
|
||||||
type="dmg"
|
type="dmg"
|
||||||
downloadURL=https://cdn.loom.com/desktop-packages/$(curl -fs https://s3-us-west-2.amazonaws.com/loom.desktop.packages/loom-inc-production/desktop-packages/latest-mac.yml | awk '/url/ && /dmg/ {print $3}' | head -1)
|
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/ && /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,13 +1,13 @@
|
|||||||
*)
|
*)
|
||||||
# unknown label
|
# unknown label
|
||||||
#printlog "unknown label $label"
|
#printlog "unknown label $label"
|
||||||
cleanupAndExit 1 "unknown label $label"
|
cleanupAndExit 1 "unknown label $label" ERROR
|
||||||
;;
|
;;
|
||||||
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."
|
printlog "Only returning label name." REQ
|
||||||
printlog "$name"
|
printlog "$name"
|
||||||
echo "$name"
|
echo "$name"
|
||||||
exit
|
exit
|
||||||
@@ -18,7 +18,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"
|
cleanupAndExit 1 "active display sleep assertion detected, aborting" ERROR
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -63,9 +63,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}"
|
printlog "LOGO=${LOGO}" INFO
|
||||||
|
|
||||||
printlog "Label type: $type"
|
printlog "Label type: $type" INFO
|
||||||
|
|
||||||
# MARK: extract info from data
|
# MARK: extract info from data
|
||||||
if [ -z "$archiveName" ]; then
|
if [ -z "$archiveName" ]; then
|
||||||
@@ -87,7 +87,7 @@ if [ -z "$archiveName" ]; then
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
printlog "archiveName: $archiveName" DEBUG
|
printlog "archiveName: $archiveName" INFO
|
||||||
|
|
||||||
if [ -z "$appName" ]; then
|
if [ -z "$appName" ]; then
|
||||||
# when not given derive from name
|
# when not given derive from name
|
||||||
@@ -106,14 +106,13 @@ if [ -z "$targetDir" ]; then
|
|||||||
updateronly)
|
updateronly)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printlog "Cannot handle type $type"
|
cleanupAndExit 99 "Cannot handle type $type" ERROR
|
||||||
cleanupAndExit 99
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z $blockingProcesses ]]; then
|
if [[ -z $blockingProcesses ]]; then
|
||||||
printlog "no blocking processes defined, using $name as default"
|
printlog "no blocking processes defined, using $name as default" INFO
|
||||||
blockingProcesses=( $name )
|
blockingProcesses=( $name )
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -129,8 +128,7 @@ 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
|
||||||
printlog "error changing directory $tmpDir"
|
cleanupAndExit 1 "error changing directory $tmpDir" ERROR
|
||||||
cleanupAndExit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# MARK: get installed version
|
# MARK: get installed version
|
||||||
@@ -153,10 +151,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."
|
cleanupAndExit 0 "No newer version." WARN
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app."
|
printlog "DEBUG mode 1 enabled, not exiting, but there is no new version of app." WARN
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@@ -175,7 +173,7 @@ if [[ (-n $appversion && -n "$updateTool") || "$type" == "updateronly" ]]; then
|
|||||||
cleanupAndExit 0
|
cleanupAndExit 0
|
||||||
fi # otherwise continue
|
fi # otherwise continue
|
||||||
else
|
else
|
||||||
printlog "DEBUG mode 1 enabled, not running update tool"
|
printlog "DEBUG mode 1 enabled, not running update tool" WARN
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -198,14 +196,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"
|
printlog "error downloading $downloadURL" ERROR
|
||||||
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" ERROR
|
displaynotification "$message" "Error updating $name"
|
||||||
else
|
else
|
||||||
displaynotification "$message" "Error installing $name" ERROR
|
displaynotification "$message" "Error installing $name"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
printlog "File list: $(ls -lh "$archiveName")" ERROR
|
printlog "File list: $(ls -lh "$archiveName")" ERROR
|
||||||
@@ -270,8 +268,7 @@ case $type in
|
|||||||
installAppInDmgInZip
|
installAppInDmgInZip
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
printlog "Cannot handle type $type"
|
cleanupAndExit 99 "Cannot handle type $type" ERROR
|
||||||
cleanupAndExit 99
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
10.0dev
|
9.1beta
|
||||||
|
|||||||
Reference in New Issue
Block a user