mirror of
https://github.com/mtan93/Installomator.git
synced 2026-03-09 13:21:53 +00:00
Version 9.4 of my MDM scripts
This commit is contained in:
358
MDM/-Installomator 1st -DEPNotify.sh
Executable file
358
MDM/-Installomator 1st -DEPNotify.sh
Executable file
@@ -0,0 +1,358 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with DEPNotify window
|
||||||
|
instance="Instance" # Name of used instance
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
|
||||||
|
# Remember: dialog dockutil
|
||||||
|
|
||||||
|
installomatorOptions="NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore INSTALL=force IGNORE_APP_STORE_APPS=yes LOGGING=REQ"
|
||||||
|
|
||||||
|
# DEPNotify display settings, change as desired
|
||||||
|
title="Installing Apps and other software"
|
||||||
|
message="Please wait while we download and install the needed software."
|
||||||
|
endMessage="Installation complete! Please reboot to activate FileVault."
|
||||||
|
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installomator 1st DEPNotify
|
||||||
|
#
|
||||||
|
# Installation using Installomator showing progress with DEPNotify
|
||||||
|
# Great stand-alone solution if installs are only done using Installomator.
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install software using Installomator.
|
||||||
|
# Script will start DEPNotify to display a progress bar.
|
||||||
|
# Progress bar moves between installations
|
||||||
|
######################################################################
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
|
||||||
|
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2.1 : 2022-05-30 : Some changes to logging
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
|
||||||
|
# v. 9.1 : 2022-04-13 : Using INSTALL=force in Label only, so Microsoft labels will not start updating
|
||||||
|
# v. 9.0.1 : 2022-02-21 : LOGO=addigy, few more "true" lines, and errorOutput on error
|
||||||
|
# v. 9.0.0 : 2022-02-14 : Updated for Inst. 9.0, Logging improved with printlog
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Check before running
|
||||||
|
case $LOGO in
|
||||||
|
addigy|microsoft)
|
||||||
|
conditionFile="/var/db/.Installomator1stDone"
|
||||||
|
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$LOGO setup detected"
|
||||||
|
echo "$conditionFile exists, so we exit."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found, so we continue…"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="$instance: Installomator 1st with DEPNotify, v$scriptVersion"
|
||||||
|
label="1st-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
exit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Command-file to DEPNotify
|
||||||
|
DEPNOTIFY_LOG="/var/tmp/depnotify.log"
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
errorCount=0
|
||||||
|
countLabels=${#what[@]}
|
||||||
|
printlog "Total installations: $countLabels"
|
||||||
|
|
||||||
|
# Using LOGO variable to specify MDM and shown logo
|
||||||
|
case $LOGO in
|
||||||
|
appstore)
|
||||||
|
# Apple App Store on Mac
|
||||||
|
if [[ $(sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
jamf)
|
||||||
|
# Jamf Pro
|
||||||
|
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosyleb)
|
||||||
|
# Mosyle Business
|
||||||
|
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosylem)
|
||||||
|
# Mosyle Manager (education)
|
||||||
|
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
addigy)
|
||||||
|
# Addigy
|
||||||
|
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
|
||||||
|
;;
|
||||||
|
microsoft)
|
||||||
|
# Microsoft Endpoint Manager (Intune)
|
||||||
|
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
ws1)
|
||||||
|
# Workspace ONE (AirWatch)
|
||||||
|
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ ! -a "${LOGO_PATH}" ]]; then
|
||||||
|
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
|
||||||
|
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printlog "LOGO: $LOGO - LOGO_PATH: $LOGO_PATH"
|
||||||
|
|
||||||
|
# Mark: Functions
|
||||||
|
printlog "depnotify_command function"
|
||||||
|
echo "" > $DEPNOTIFY_LOG || true
|
||||||
|
function depnotify_command(){
|
||||||
|
printlog "DEPNotify-command: $1"
|
||||||
|
echo "$1" >> $DEPNOTIFY_LOG || true
|
||||||
|
}
|
||||||
|
|
||||||
|
printlog "startDEPNotify function"
|
||||||
|
function startDEPNotify() {
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
launchctl asuser $currentUserID open -a "/Applications/Utilities/DEPNotify.app/Contents/MacOS/DEPNotify" --args -path "$DEPNOTIFY_LOG" || true # --args -fullScreen
|
||||||
|
sleep 5
|
||||||
|
depnotify_command "Command: KillCommandFile:"
|
||||||
|
depnotify_command "Command: MainTitle: $title"
|
||||||
|
depnotify_command "Command: Image: $LOGO_PATH"
|
||||||
|
depnotify_command "Command: MainText: $message"
|
||||||
|
depnotify_command "Command: Determinate: $countLabels"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Notify the user using AppleScript
|
||||||
|
printlog "displayDialog function"
|
||||||
|
function displayDialog(){
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
if [[ "$currentUser" != "" ]]; then
|
||||||
|
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Code
|
||||||
|
name="Installomator"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="JME5BW3F3R"
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
|
||||||
|
printlog "${destFile} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion} ..."
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Installing DEPNotify
|
||||||
|
cmdOutput="$( ${destFile} depnotify LOGO=$LOGO NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore LOGGING=WARN || true )"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
printlog "DEPNotify install result: $exitStatus"
|
||||||
|
|
||||||
|
itemName=""
|
||||||
|
errorLabels=""
|
||||||
|
((countLabels++))
|
||||||
|
((countLabels--))
|
||||||
|
printlog "$countLabels labels to install"
|
||||||
|
|
||||||
|
startDEPNotify
|
||||||
|
|
||||||
|
for item in "${what[@]}"; do
|
||||||
|
# Check if DEPNotify is running and try open it if not
|
||||||
|
if ! pgrep -xq "DEPNotify"; then
|
||||||
|
startDEPNotify
|
||||||
|
fi
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
depnotify_command "Status: $itemName installing…"
|
||||||
|
else
|
||||||
|
depnotify_command "Status: $item installing…"
|
||||||
|
fi
|
||||||
|
printlog "$item $itemName"
|
||||||
|
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
|
||||||
|
#cmdOutput="2022-05-19 13:20:45 : REQ : installomator : ################## End Installomator, exit code 0"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
printlog "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
|
||||||
|
printlog "$warnOutput"
|
||||||
|
else
|
||||||
|
printlog "Error installing ${item}. Exit code ${exitStatus}"
|
||||||
|
#printlog "$cmdOutput"
|
||||||
|
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
printlog "$errorOutput"
|
||||||
|
((errorCount++))
|
||||||
|
errorLabels="$errorLabels ${item}"
|
||||||
|
fi
|
||||||
|
((countLabels--))
|
||||||
|
itemName=""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Mark: Finishing
|
||||||
|
# Prevent re-run of script if conditionFile is set
|
||||||
|
if [[ ! -z "$conditionFile" ]]; then
|
||||||
|
printlog "Touching condition file so script will not run again"
|
||||||
|
touch "$conditionFile" || true
|
||||||
|
printlog "$(ls -al "$conditionFile" || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error to user if any
|
||||||
|
printlog "Errors: $errorCount"
|
||||||
|
if [[ $errorCount -ne 0 ]]; then
|
||||||
|
errorMessage="${errorMessage} Total errors: $errorCount"
|
||||||
|
message="$errorMessage"
|
||||||
|
displayDialog &
|
||||||
|
endMessage="$message"
|
||||||
|
printlog "errorLabels: $errorLabels"
|
||||||
|
fi
|
||||||
|
|
||||||
|
depnotify_command "Command: MainText: $endMessage"
|
||||||
|
depnotify_command "Command: Quit: $endMessage"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
printlog "Remove $(rm -fv $DEPNOTIFY_LOG || true)"
|
||||||
|
|
||||||
|
printlog "Ending"
|
||||||
|
caffexit $errorCount
|
||||||
358
MDM/-Installomator 1st SS DEPNotify.sh
Executable file
358
MDM/-Installomator 1st SS DEPNotify.sh
Executable file
@@ -0,0 +1,358 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with DEPNotify window
|
||||||
|
instance="Instance" # Name of used instance
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
|
||||||
|
# Remember: dialog dockutil
|
||||||
|
|
||||||
|
installomatorOptions="NOTIFY=all BLOCKING_PROCESS_ACTION=prompt_user"
|
||||||
|
|
||||||
|
# DEPNotify display settings, change as desired
|
||||||
|
title="Installing Apps and other software"
|
||||||
|
message="Please wait while we download and install the needed software."
|
||||||
|
endMessage="Installation complete! Please reboot to activate FileVault."
|
||||||
|
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installomator 1st DEPNotify
|
||||||
|
#
|
||||||
|
# Installation using Installomator showing progress with DEPNotify
|
||||||
|
# Great stand-alone solution if installs are only done using Installomator.
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install software using Installomator.
|
||||||
|
# Script will start DEPNotify to display a progress bar.
|
||||||
|
# Progress bar moves between installations
|
||||||
|
######################################################################
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
|
||||||
|
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2.1 : 2022-05-30 : Some changes to logging
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
|
||||||
|
# v. 9.1 : 2022-04-13 : Using INSTALL=force in Label only, so Microsoft labels will not start updating
|
||||||
|
# v. 9.0.1 : 2022-02-21 : LOGO=addigy, few more "true" lines, and errorOutput on error
|
||||||
|
# v. 9.0.0 : 2022-02-14 : Updated for Inst. 9.0, Logging improved with printlog
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Check before running
|
||||||
|
case $LOGO in
|
||||||
|
addigy|microsoft)
|
||||||
|
conditionFile="/var/db/.Installomator1stDone"
|
||||||
|
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$LOGO setup detected"
|
||||||
|
echo "$conditionFile exists, so we exit."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found, so we continue…"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="$instance: Installomator 1st with DEPNotify, v$scriptVersion"
|
||||||
|
label="1st-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
exit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Command-file to DEPNotify
|
||||||
|
DEPNOTIFY_LOG="/var/tmp/depnotify.log"
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
errorCount=0
|
||||||
|
countLabels=${#what[@]}
|
||||||
|
printlog "Total installations: $countLabels"
|
||||||
|
|
||||||
|
# Using LOGO variable to specify MDM and shown logo
|
||||||
|
case $LOGO in
|
||||||
|
appstore)
|
||||||
|
# Apple App Store on Mac
|
||||||
|
if [[ $(sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
jamf)
|
||||||
|
# Jamf Pro
|
||||||
|
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosyleb)
|
||||||
|
# Mosyle Business
|
||||||
|
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosylem)
|
||||||
|
# Mosyle Manager (education)
|
||||||
|
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
addigy)
|
||||||
|
# Addigy
|
||||||
|
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
|
||||||
|
;;
|
||||||
|
microsoft)
|
||||||
|
# Microsoft Endpoint Manager (Intune)
|
||||||
|
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
ws1)
|
||||||
|
# Workspace ONE (AirWatch)
|
||||||
|
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ ! -a "${LOGO_PATH}" ]]; then
|
||||||
|
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
|
||||||
|
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printlog "LOGO: $LOGO - LOGO_PATH: $LOGO_PATH"
|
||||||
|
|
||||||
|
# Mark: Functions
|
||||||
|
printlog "depnotify_command function"
|
||||||
|
echo "" > $DEPNOTIFY_LOG || true
|
||||||
|
function depnotify_command(){
|
||||||
|
printlog "DEPNotify-command: $1"
|
||||||
|
echo "$1" >> $DEPNOTIFY_LOG || true
|
||||||
|
}
|
||||||
|
|
||||||
|
printlog "startDEPNotify function"
|
||||||
|
function startDEPNotify() {
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
launchctl asuser $currentUserID open -a "/Applications/Utilities/DEPNotify.app/Contents/MacOS/DEPNotify" --args -path "$DEPNOTIFY_LOG" || true # --args -fullScreen
|
||||||
|
sleep 5
|
||||||
|
depnotify_command "Command: KillCommandFile:"
|
||||||
|
depnotify_command "Command: MainTitle: $title"
|
||||||
|
depnotify_command "Command: Image: $LOGO_PATH"
|
||||||
|
depnotify_command "Command: MainText: $message"
|
||||||
|
depnotify_command "Command: Determinate: $countLabels"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Notify the user using AppleScript
|
||||||
|
printlog "displayDialog function"
|
||||||
|
function displayDialog(){
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
if [[ "$currentUser" != "" ]]; then
|
||||||
|
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Code
|
||||||
|
name="Installomator"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="JME5BW3F3R"
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
|
||||||
|
printlog "${destFile} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion} ..."
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Installing DEPNotify
|
||||||
|
cmdOutput="$( ${destFile} depnotify LOGO=$LOGO NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore LOGGING=WARN || true )"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
printlog "DEPNotify install result: $exitStatus"
|
||||||
|
|
||||||
|
itemName=""
|
||||||
|
errorLabels=""
|
||||||
|
((countLabels++))
|
||||||
|
((countLabels--))
|
||||||
|
printlog "$countLabels labels to install"
|
||||||
|
|
||||||
|
startDEPNotify
|
||||||
|
|
||||||
|
for item in "${what[@]}"; do
|
||||||
|
# Check if DEPNotify is running and try open it if not
|
||||||
|
if ! pgrep -xq "DEPNotify"; then
|
||||||
|
startDEPNotify
|
||||||
|
fi
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
depnotify_command "Status: $itemName installing…"
|
||||||
|
else
|
||||||
|
depnotify_command "Status: $item installing…"
|
||||||
|
fi
|
||||||
|
printlog "$item $itemName"
|
||||||
|
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
|
||||||
|
#cmdOutput="2022-05-19 13:20:45 : REQ : installomator : ################## End Installomator, exit code 0"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
printlog "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
|
||||||
|
printlog "$warnOutput"
|
||||||
|
else
|
||||||
|
printlog "Error installing ${item}. Exit code ${exitStatus}"
|
||||||
|
#printlog "$cmdOutput"
|
||||||
|
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
printlog "$errorOutput"
|
||||||
|
((errorCount++))
|
||||||
|
errorLabels="$errorLabels ${item}"
|
||||||
|
fi
|
||||||
|
((countLabels--))
|
||||||
|
itemName=""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Mark: Finishing
|
||||||
|
# Prevent re-run of script if conditionFile is set
|
||||||
|
if [[ ! -z "$conditionFile" ]]; then
|
||||||
|
printlog "Touching condition file so script will not run again"
|
||||||
|
touch "$conditionFile" || true
|
||||||
|
printlog "$(ls -al "$conditionFile" || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error to user if any
|
||||||
|
printlog "Errors: $errorCount"
|
||||||
|
if [[ $errorCount -ne 0 ]]; then
|
||||||
|
errorMessage="${errorMessage} Total errors: $errorCount"
|
||||||
|
message="$errorMessage"
|
||||||
|
displayDialog &
|
||||||
|
endMessage="$message"
|
||||||
|
printlog "errorLabels: $errorLabels"
|
||||||
|
fi
|
||||||
|
|
||||||
|
depnotify_command "Command: MainText: $endMessage"
|
||||||
|
depnotify_command "Command: Quit: $endMessage"
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
printlog "Remove $(rm -fv $DEPNOTIFY_LOG || true)"
|
||||||
|
|
||||||
|
printlog "Ending"
|
||||||
|
caffexit $errorCount
|
||||||
302
MDM/-Installomator 1st SS.sh
Executable file
302
MDM/-Installomator 1st SS.sh
Executable file
@@ -0,0 +1,302 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
instance="Instance" # Name of used instance
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what=(dialog dockutil microsoftautoupdate supportapp applenyfonts applesfpro applesfmono applesfcompact xink zohoworkdrivetruesync textmate 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
|
||||||
|
# Remember: dialog dockutil
|
||||||
|
|
||||||
|
installomatorOptions="NOTIFY=all BLOCKING_PROCESS_ACTION=prompt_user"
|
||||||
|
|
||||||
|
# Error message to user if any occur
|
||||||
|
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installomator 1st for Self Service
|
||||||
|
#
|
||||||
|
# Installation using Installomator
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install software using Installomator, where the user activate it in Self Service.
|
||||||
|
# Script will display a dialog if any errors happens.
|
||||||
|
# Progress is shown in notifications to the user
|
||||||
|
######################################################################
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
|
||||||
|
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2.1 : 2022-05-30 : Some changes to logging
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Check before running
|
||||||
|
case $LOGO in
|
||||||
|
addigy|microsoft)
|
||||||
|
conditionFile="/var/db/.Installomator1stDone"
|
||||||
|
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$LOGO setup detected"
|
||||||
|
echo "$conditionFile exists, so we exit."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found, so we continue…"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="$instance: Installomator 1st, v$scriptVersion"
|
||||||
|
label="1st-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
caffexit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
errorCount=0
|
||||||
|
countLabels=${#what[@]}
|
||||||
|
printlog "Total installations: $countLabels"
|
||||||
|
|
||||||
|
# Using LOGO variable to specify MDM and shown logo
|
||||||
|
case $LOGO in
|
||||||
|
appstore)
|
||||||
|
# Apple App Store on Mac
|
||||||
|
if [[ $(sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
jamf)
|
||||||
|
# Jamf Pro
|
||||||
|
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosyleb)
|
||||||
|
# Mosyle Business
|
||||||
|
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosylem)
|
||||||
|
# Mosyle Manager (education)
|
||||||
|
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
addigy)
|
||||||
|
# Addigy
|
||||||
|
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
|
||||||
|
;;
|
||||||
|
microsoft)
|
||||||
|
# Microsoft Endpoint Manager (Intune)
|
||||||
|
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
ws1)
|
||||||
|
# Workspace ONE (AirWatch)
|
||||||
|
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ ! -a "${LOGO_PATH}" ]]; then
|
||||||
|
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
|
||||||
|
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printlog "LOGO: $LOGO – LOGO_PATH: $LOGO_PATH"
|
||||||
|
|
||||||
|
# Mark: Functions
|
||||||
|
# Notify the user using AppleScript
|
||||||
|
function displayDialog(){
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
if [[ "$currentUser" != "" ]]; then
|
||||||
|
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Code
|
||||||
|
name="Installomator"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="JME5BW3F3R"
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
|
||||||
|
printlog "${destFile} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion} ..."
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
errorLabels=""
|
||||||
|
((countLabels++))
|
||||||
|
((countLabels--))
|
||||||
|
printlog "$countLabels labels to install"
|
||||||
|
|
||||||
|
for item in "${what[@]}"; do
|
||||||
|
printlog "$item"
|
||||||
|
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
printlog "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
|
||||||
|
printlog "$warnOutput"
|
||||||
|
else
|
||||||
|
printlog "Error installing ${item}. Exit code ${exitStatus}"
|
||||||
|
#printlog "$cmdOutput"
|
||||||
|
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
printlog "$errorOutput"
|
||||||
|
((errorCount++))
|
||||||
|
errorLabels="$errorLabels ${item}"
|
||||||
|
fi
|
||||||
|
((countLabels--))
|
||||||
|
itemName=""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Mark: Finishing
|
||||||
|
# Prevent re-run of script if conditionFile is set
|
||||||
|
if [[ ! -z "$conditionFile" ]]; then
|
||||||
|
printlog "Touching condition file so script will not run again"
|
||||||
|
touch "$conditionFile" || true
|
||||||
|
printlog "$(ls -al "$conditionFile" || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error to user if any
|
||||||
|
printlog "Errors: $errorCount"
|
||||||
|
if [[ $errorCount -ne 0 ]]; then
|
||||||
|
printlog "ERROR: Display error dialog to user!"
|
||||||
|
errorMessage="${errorMessage} Total errors: $errorCount"
|
||||||
|
message="$errorMessage"
|
||||||
|
displayDialog &
|
||||||
|
printlog "errorLabels: $errorLabels"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printlog "Ending"
|
||||||
|
caffexit $errorCount
|
||||||
13
MDM/-Installomator 1st condition Addigy.sh
Normal file
13
MDM/-Installomator 1st condition Addigy.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Mark: Addigy Condition on condition file
|
||||||
|
# Install on success
|
||||||
|
|
||||||
|
conditionFile="/var/db/.Installomator1stDone"
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$conditionFile exists. Exiting."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found. Continue…"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
305
MDM/-Installomator 1st.sh
Executable file
305
MDM/-Installomator 1st.sh
Executable file
@@ -0,0 +1,305 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
instance="Instance" # Name of used instance
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what=(dialog dockutil microsoftautoupdate supportapp xink zohoworkdrivetruesync textmate applenyfonts applesfpro applesfmono applesfcompact 1password7 wwdc theunarchiver keka microsoftedge microsoftteams microsoftonedrive microsoftoffice365)
|
||||||
|
# Remember: dialog dockutil
|
||||||
|
|
||||||
|
installomatorOptions="NOTIFY=silent BLOCKING_PROCESS_ACTION=ignore INSTALL=force IGNORE_APP_STORE_APPS=yes LOGGING=REQ"
|
||||||
|
|
||||||
|
# Error message to user if any occur
|
||||||
|
showError="1" # Show error message if 1 (0 if it should not be shown)
|
||||||
|
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installomator 1st
|
||||||
|
#
|
||||||
|
# Installation using Installomator (use separate Installation1stProgress script to show progress)
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install software using Installomator.
|
||||||
|
# Script will display a dialog if any errors happens.
|
||||||
|
# User is not notified about installations.
|
||||||
|
######################################################################
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : Making error message optional. downloadURL can fall back on GitHub API.
|
||||||
|
# v. 9.3 : 2022-08-29 : installomatorOptions in quotes and ignore blocking processes. Improved installation with looping if it fails, so it can try again. Improved GitHub handling. ws1 support.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : installomatorOptions introduced. Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2.1 : 2022-05-30 : Some changes to logging
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installomator, and display dialog if error happens. Now universal script for all supported MDMs based on LOGO variable.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Check before running
|
||||||
|
case $LOGO in
|
||||||
|
addigy|microsoft)
|
||||||
|
conditionFile="/var/db/.Installomator1stDone"
|
||||||
|
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$LOGO setup detected"
|
||||||
|
echo "$conditionFile exists, so we exit."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found, so we continue…"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="$instance: Installomator 1st, v$scriptVersion"
|
||||||
|
label="1st-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
caffexit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
errorCount=0
|
||||||
|
countLabels=${#what[@]}
|
||||||
|
printlog "Total installations: $countLabels"
|
||||||
|
|
||||||
|
# Using LOGO variable to specify MDM and shown logo
|
||||||
|
case $LOGO in
|
||||||
|
appstore)
|
||||||
|
# Apple App Store on Mac
|
||||||
|
if [[ $(sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
jamf)
|
||||||
|
# Jamf Pro
|
||||||
|
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosyleb)
|
||||||
|
# Mosyle Business
|
||||||
|
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosylem)
|
||||||
|
# Mosyle Manager (education)
|
||||||
|
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
addigy)
|
||||||
|
# Addigy
|
||||||
|
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
|
||||||
|
;;
|
||||||
|
microsoft)
|
||||||
|
# Microsoft Endpoint Manager (Intune)
|
||||||
|
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
ws1)
|
||||||
|
# Workspace ONE (AirWatch)
|
||||||
|
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ ! -a "${LOGO_PATH}" ]]; then
|
||||||
|
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
|
||||||
|
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printlog "LOGO: $LOGO – LOGO_PATH: $LOGO_PATH"
|
||||||
|
|
||||||
|
# Mark: Functions
|
||||||
|
# Notify the user using AppleScript
|
||||||
|
function displayDialog(){
|
||||||
|
currentUser="$(stat -f "%Su" /dev/console)"
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
if [[ "$currentUser" != "" ]]; then
|
||||||
|
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Code
|
||||||
|
name="Installomator"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="JME5BW3F3R"
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
|
||||||
|
printlog "${destFile} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion} ..."
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
errorLabels=""
|
||||||
|
((countLabels++))
|
||||||
|
((countLabels--))
|
||||||
|
printlog "$countLabels labels to install"
|
||||||
|
|
||||||
|
for item in "${what[@]}"; do
|
||||||
|
printlog "$item"
|
||||||
|
cmdOutput="$( ${destFile} ${item} LOGO=$LOGO ${installomatorOptions} || true )"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
printlog "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text "WARN" || true )"
|
||||||
|
printlog "$warnOutput"
|
||||||
|
else
|
||||||
|
printlog "Error installing ${item}. Exit code ${exitStatus}"
|
||||||
|
#printlog "$cmdOutput"
|
||||||
|
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
printlog "$errorOutput"
|
||||||
|
((errorCount++))
|
||||||
|
errorLabels="$errorLabels ${item}"
|
||||||
|
fi
|
||||||
|
((countLabels--))
|
||||||
|
itemName=""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Mark: Finishing
|
||||||
|
# Prevent re-run of script if conditionFile is set
|
||||||
|
if [[ ! -z "$conditionFile" ]]; then
|
||||||
|
printlog "Touching condition file so script will not run again"
|
||||||
|
touch "$conditionFile" || true
|
||||||
|
printlog "$(ls -al "$conditionFile" || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Show error to user if any
|
||||||
|
printlog "Errors: $errorCount"
|
||||||
|
if [[ $errorCount -ne 0 ]]; then
|
||||||
|
printlog "ERROR: Display error dialog to user!"
|
||||||
|
errorMessage="${errorMessage} Total errors: $errorCount"
|
||||||
|
if [[ $showError -eq 1 ]]; then
|
||||||
|
message="$errorMessage"
|
||||||
|
displayDialog &
|
||||||
|
fi
|
||||||
|
printlog "errorLabels: $errorLabels"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printlog "Ending"
|
||||||
|
caffexit $errorCount
|
||||||
13
MDM/-Progress 1st Dialog condition.sh
Normal file
13
MDM/-Progress 1st Dialog condition.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Mark: Addigy Condition on condition file
|
||||||
|
# Install on success
|
||||||
|
|
||||||
|
conditionFile="/var/db/.Installation1stProgressDone"
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$conditionFile exists. Exiting."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found. Continue…"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
395
MDM/-Progress 1st Dialog.sh
Executable file
395
MDM/-Progress 1st Dialog.sh
Executable file
@@ -0,0 +1,395 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Progress 1st with swiftDialog
|
||||||
|
instance="Instance" # Name of used instance
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "appstore", "jamf", "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
apps=(
|
||||||
|
"swiftDialog,/usr/local/bin/dialog"
|
||||||
|
"dockutil,/usr/local/bin/dockutil"
|
||||||
|
"desktoppr,/usr/local/bin/desktoppr"
|
||||||
|
"SupportApp,/Applications/Support.app"
|
||||||
|
"Xink,/Applications/Xink.app"
|
||||||
|
"Apple NewYork Font,/Library/Fonts/NewYork.ttf"
|
||||||
|
"Apple SF Pro Font,/Library/Fonts/SF-Pro.ttf"
|
||||||
|
"Apple SF Mono Font,/Library/Fonts/SF-Mono-Bold.otf"
|
||||||
|
"Apple SF Compact Font,/Library/Fonts/SF-Compact.ttf"
|
||||||
|
"Zoho WorkDrive TrueSync,/Applications/Zoho WorkDrive TrueSync.app"
|
||||||
|
"TextMate,/Applications/TextMate.app"
|
||||||
|
"Sublime Text,/Applications/Sublime Text.app"
|
||||||
|
"1Password,/Applications/1Password 7.app"
|
||||||
|
"Mactracker,/Applications/Mactracker.app"
|
||||||
|
"WWDC,/Applications/WWDC.app"
|
||||||
|
"The Unarchiver,/Applications/The Unarchiver.app"
|
||||||
|
"Keka,/Applications/Keka.app"
|
||||||
|
"Brave,/Applications/Brave Browser.app"
|
||||||
|
"Firefox,/Applications/Firefox.app"
|
||||||
|
"Microsoft AutoUpdate,/Library/Application Support/Microsoft/MAU2.0/Microsoft AutoUpdate.app"
|
||||||
|
"Microsoft Edge,/Applications/Microsoft Edge.app"
|
||||||
|
"Microsoft Teams,/Applications/Microsoft Teams.app"
|
||||||
|
"Microsoft Excel,/Applications/Microsoft Excel.app"
|
||||||
|
"Microsoft OneNote,/Applications/Microsoft OneNote.app"
|
||||||
|
"Microsoft Outlook,/Applications/Microsoft Outlook.app"
|
||||||
|
"Microsoft PowerPoint,/Applications/Microsoft PowerPoint.app"
|
||||||
|
"Microsoft Word,/Applications/Microsoft Word.app"
|
||||||
|
"Microsoft OneDrive,/Applications/OneDrive.app"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Dialog display settings, change as desired
|
||||||
|
title="Installing Apps and other software"
|
||||||
|
message="Please wait while we download and install the needed software."
|
||||||
|
endMessage="Installation complete! Please reboot to activate FileVault."
|
||||||
|
displayEndMessageDialog=1 # Should endMessage be shown as a dialog? (0|1)
|
||||||
|
errorMessage="A problem was encountered setting up this Mac. Please contact IT."
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Progress 1st Dialog
|
||||||
|
#
|
||||||
|
# Showing installation progress using swiftDialog
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# Complete script meant for running via MDM on device enrollment. This will download
|
||||||
|
# and install Dialog on the fly before opening Dialog.
|
||||||
|
#
|
||||||
|
# Log: /private/var/log/InstallationProgress.log
|
||||||
|
# This file prevents script from running again on Addigy and Microsoft Endpoint (Intune):
|
||||||
|
# "/var/db/.Installation1stProgress"
|
||||||
|
#
|
||||||
|
# Display a Dialog with a list of applications and indicate when they’ve been installed
|
||||||
|
# Useful when apps are deployed at random, perhaps without local logging.
|
||||||
|
# Applies to Mosyle App Catalog installs, VPP app installs, Installomator installs etc.
|
||||||
|
# The script watches the existence of files in the file system, so that is used to show progress.
|
||||||
|
#
|
||||||
|
# Requires Dialog v1.9.1 or later (will be installed) https://github.com/bartreardon/swiftDialog
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Based on the work by Adam Codega:
|
||||||
|
# https://github.com/acodega/dialog-scripts
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
# List of apps/installs to process in “apps” array.
|
||||||
|
# Provide the display name as you prefer and the path to the app/file. ex:
|
||||||
|
# "Google Chrome,/Applications/Google Chrome.app"
|
||||||
|
# A comma separates the display name from the path. Do not use commas in your display name text.
|
||||||
|
#
|
||||||
|
# Tip: Check for something like print drivers using the pkg receipt, like:
|
||||||
|
# "Konica-Minolta drivers,/var/db/receipts/jp.konicaminolta.print.package.C759.plist"
|
||||||
|
# Or fonts, like:
|
||||||
|
# "Apple SF Pro Font,/Library/Fonts/SF-Pro.ttf"
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
|
||||||
|
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : Improved Dialog installation. Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2 : 2022-05-19 : Not using GitHub api for download of Dialog, show a dialog when finished to make message more important. Now universal script for all supported MDMs based on LOGO variable.
|
||||||
|
# v. 9.0 : 2022-05-16 : Based on acodega’s work, I have added progress bar, changed logging and use another log-location, a bit more error handling for Dialog download, added some "|| true"-endings to some lines to not make them fail in Addigy, and some more.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Check before running
|
||||||
|
case $LOGO in
|
||||||
|
addigy|microsoft)
|
||||||
|
conditionFile="/var/db/.Installation1stProgressDone"
|
||||||
|
# Addigy and Microsoft Endpoint Manager (Intune) need a check for a touched file
|
||||||
|
if [ -e "$conditionFile" ]; then
|
||||||
|
echo "$LOGO setup detected"
|
||||||
|
echo "$conditionFile exists, so we exit."
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
echo "$conditionFile not found, so we continue…"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Mark: Constants and logging
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
log_message="$instance: Installation 1st Progress with Dialog, v$scriptVersion"
|
||||||
|
label="D1st-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installation1stProgress.log"
|
||||||
|
function printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
exit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Location of dialog and dialog command file
|
||||||
|
dialogApp="/usr/local/bin/dialog"
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
counterFile="/var/tmp/Installation1stProgress.plist"
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
progress_index=0
|
||||||
|
step_progress=0
|
||||||
|
defaults write $counterFile step -int 0
|
||||||
|
progress_total=${#apps[@]}
|
||||||
|
printlog "Total watched installations: $progress_total"
|
||||||
|
|
||||||
|
# Using LOGO variable to specify MDM and shown logo
|
||||||
|
case $LOGO in
|
||||||
|
appstore)
|
||||||
|
# Apple App Store on Mac
|
||||||
|
if [[ $(sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
jamf)
|
||||||
|
# Jamf Pro
|
||||||
|
LOGO_PATH="/Library/Application Support/JAMF/Jamf.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosyleb)
|
||||||
|
# Mosyle Business
|
||||||
|
LOGO_PATH="/Applications/Self-Service.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
mosylem)
|
||||||
|
# Mosyle Manager (education)
|
||||||
|
LOGO_PATH="/Applications/Manager.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
addigy)
|
||||||
|
# Addigy
|
||||||
|
LOGO_PATH="/Library/Addigy/macmanage/MacManage.app/Contents/Resources/atom.icns"
|
||||||
|
;;
|
||||||
|
microsoft)
|
||||||
|
# Microsoft Endpoint Manager (Intune)
|
||||||
|
LOGO_PATH="/Library/Intune/Microsoft Intune Agent.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
ws1)
|
||||||
|
# Workspace ONE (AirWatch)
|
||||||
|
LOGO="/Applications/Workspace ONE Intelligent Hub.app/Contents/Resources/AppIcon.icns"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [[ ! -a "${LOGO_PATH}" ]]; then
|
||||||
|
printlog "ERROR in LOGO_PATH '${LOGO_PATH}', setting Mac App Store."
|
||||||
|
if [[ $(/usr/bin/sw_vers -buildVersion) > "19" ]]; then
|
||||||
|
LOGO_PATH="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
else
|
||||||
|
LOGO_PATH="/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
printlog "LOGO: $LOGO – LOGO_PATH: $LOGO_PATH"
|
||||||
|
|
||||||
|
# Mark: Functions
|
||||||
|
# execute a dialog command
|
||||||
|
echo "" > $dialog_command_file || true
|
||||||
|
function dialog_command(){
|
||||||
|
printlog "Dialog-command: $1"
|
||||||
|
echo "$1" >> $dialog_command_file || true
|
||||||
|
}
|
||||||
|
|
||||||
|
function appCheck(){
|
||||||
|
dialog_command "listitem: $(echo "$app" | cut -d ',' -f1): wait"
|
||||||
|
while [ ! -e "$(echo "$app" | cut -d ',' -f2)" ]; do
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
dialog_command "progresstext: Install of “$(echo "$app" | cut -d ',' -f1)” complete"
|
||||||
|
dialog_command "listitem: $(echo "$app" | cut -d ',' -f1): ✅"
|
||||||
|
progress_index=$(defaults read $counterFile step)
|
||||||
|
progress_index=$(( progress_index + 1 ))
|
||||||
|
defaults write $counterFile step -int $progress_index
|
||||||
|
dialog_command "progress: $progress_index"
|
||||||
|
printlog "at item number $progress_index"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Notify the user using AppleScript
|
||||||
|
function displayDialog(){
|
||||||
|
if [[ "$currentUser" != "" ]]; then
|
||||||
|
launchctl asuser $currentUserID sudo -u $currentUser osascript -e "button returned of (display dialog \"$message\" buttons {\"OK\"} default button \"OK\" with icon POSIX file \"$LOGO_PATH\")" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Code
|
||||||
|
name="Dialog"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg w. app version check
|
||||||
|
gitusername="bartreardon"
|
||||||
|
gitreponame="swiftDialog"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="PWA5E9TQ59"
|
||||||
|
destFile="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
versionKey="CFBundleShortVersionString" #CFBundleVersion
|
||||||
|
|
||||||
|
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
|
||||||
|
printlog "${name} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion}…"
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
while [ "$(pgrep -l "Setup Assistant")" != "" ]; do
|
||||||
|
printlog "Setup Assistant Still Running. PID $setupAssistantProcess."
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
printlog "Out of Setup Assistant."
|
||||||
|
|
||||||
|
while [ "$(pgrep -l "Finder")" = "" ]; do
|
||||||
|
printlog "Finder process not found. Assuming device is at login screen. PID $finderProcess"
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
printlog "Finder is running…"
|
||||||
|
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
currentUserID=$(id -u "$currentUser")
|
||||||
|
printlog "Logged in user is $currentUser with ID $currentUserID"
|
||||||
|
|
||||||
|
# set icon based on whether computer is a desktop or laptop
|
||||||
|
#hwType=$(system_profiler SPHardwareDataType | grep "Model Identifier" | grep "Book" || true)
|
||||||
|
#if [ "$hwType" != "" ]; then
|
||||||
|
# LOGO_PATH="SF=laptopcomputer.and.arrow.down,weight=thin,colour1=#51a3ef,colour2=#5154ef"
|
||||||
|
#else
|
||||||
|
# LOGO_PATH="SF=desktopcomputer.and.arrow.down,weight=thin,colour1=#51a3ef,colour2=#5154ef"
|
||||||
|
#fi
|
||||||
|
|
||||||
|
dialogCMD="$dialogApp -p --title \"$title\" \
|
||||||
|
--message \"$message\" \
|
||||||
|
--icon \"$LOGO_PATH\" \
|
||||||
|
--progress $progress_total \
|
||||||
|
--button1text \"Please Wait\" \
|
||||||
|
--button1disabled"
|
||||||
|
|
||||||
|
# create the list of apps
|
||||||
|
listitems=""
|
||||||
|
for app in "${apps[@]}"; do
|
||||||
|
listitems="$listitems --listitem '$(echo "$app" | cut -d ',' -f1)'"
|
||||||
|
done
|
||||||
|
|
||||||
|
# final command to execute
|
||||||
|
dialogCMD="$dialogCMD $listitems"
|
||||||
|
|
||||||
|
printlog "$dialogCMD"
|
||||||
|
|
||||||
|
# Launch dialog and run it in the background sleep for a second to let thing initialise
|
||||||
|
printlog "About to launch Dialog."
|
||||||
|
eval "$dialogCMD" &
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
(for app in "${apps[@]}"; do
|
||||||
|
#step_progress=$(( 1 + progress_index ))
|
||||||
|
#dialog_command "progress: $step_progress"
|
||||||
|
sleep 0.5
|
||||||
|
appCheck &
|
||||||
|
done
|
||||||
|
|
||||||
|
wait)
|
||||||
|
|
||||||
|
# Mark: Finishing
|
||||||
|
|
||||||
|
# Prevent re-run of script if conditionFile is set
|
||||||
|
if [[ ! -z "$conditionFile" ]]; then
|
||||||
|
printlog "Touching condition file so script will not run again"
|
||||||
|
touch "$conditionFile" || true
|
||||||
|
printlog "$(ls -al "$conditionFile" || true)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# all done. close off processing and enable the "Done" button
|
||||||
|
printlog "Finalizing."
|
||||||
|
dialog_command "progresstext: $endMessage"
|
||||||
|
dialog_command "progress: complete"
|
||||||
|
dialog_command "button1text: Done"
|
||||||
|
dialog_command "button1: enable"
|
||||||
|
|
||||||
|
if [[ $displayEndMessageDialog -eq 1 ]]; then
|
||||||
|
message="$endMessage"
|
||||||
|
displayDialog &
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
printlog $(rm -fv $dialog_command_file || true)
|
||||||
|
printlog $(rm -fv $counterFile || true)
|
||||||
|
|
||||||
|
printlog "Ending"
|
||||||
17
MDM/-install Dialog direct condition.sh
Executable file
17
MDM/-install Dialog direct condition.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
gitusername="bartreardon"
|
||||||
|
gitreponame="swiftDialog"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
|
||||||
|
destFile="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
versionKey="CFBundleShortVersionString" #CFBundleVersion
|
||||||
|
|
||||||
|
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
#echo "Let's install…"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
#echo "No need!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
148
MDM/-install Dialog direct.sh
Executable file
148
MDM/-install Dialog direct.sh
Executable file
@@ -0,0 +1,148 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installation of swiftDialog
|
||||||
|
#
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install swiftDialog directly from GitHub.
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API.
|
||||||
|
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator. Universal script.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="Dialog install, v$scriptVersion"
|
||||||
|
label="Dialog-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
exit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
name="Dialog"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg w. app version check
|
||||||
|
gitusername="bartreardon"
|
||||||
|
gitreponame="swiftDialog"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="PWA5E9TQ59"
|
||||||
|
destFile="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
versionKey="CFBundleShortVersionString" #CFBundleVersion
|
||||||
|
|
||||||
|
currentInstalledVersion="$(defaults read "${destFile}/Contents/Info.plist" $versionKey || true)"
|
||||||
|
printlog "${name} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion}…"
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
caffexit 0
|
||||||
14
MDM/-install Installomator direct condition.sh
Executable file
14
MDM/-install Installomator direct condition.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [[ ! -e "${destFile}" || "$(${destFile} version)" != "$appNewVersion" ]]; then
|
||||||
|
#echo "Let's install…"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
#echo "No need!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
147
MDM/-install Installomator direct.sh
Executable file
147
MDM/-install Installomator direct.sh
Executable file
@@ -0,0 +1,147 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
######################################################################
|
||||||
|
# Installation of Installomator
|
||||||
|
#
|
||||||
|
# No customization below…
|
||||||
|
######################################################################
|
||||||
|
# This script can be used to install Installomator directly from GitHub.
|
||||||
|
######################################################################
|
||||||
|
#
|
||||||
|
# This script made by Søren Theilgaard
|
||||||
|
# https://github.com/Theile
|
||||||
|
# Twitter and MacAdmins Slack: @theilgaard
|
||||||
|
#
|
||||||
|
# Some functions and code from Installomator:
|
||||||
|
# https://github.com/Installomator/Installomator
|
||||||
|
#
|
||||||
|
######################################################################
|
||||||
|
scriptVersion="9.4"
|
||||||
|
# v. 9.4 : 2022-09-14 : downloadURL can fall back on GitHub API
|
||||||
|
# v. 9.3 : 2022-08-29 : Logging changed for current version. Improved installation with looping if it fails, so it can try again. Improved GitHub handling.
|
||||||
|
# v. 9.2.2 : 2022-06-17 : Check 1.1.1.1 for internet connection.
|
||||||
|
# v. 9.2 : 2022-05-19 : Built in installer for Installlomator. Universal script.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Mark: Constants, logging and caffeinate
|
||||||
|
log_message="Installomator install, v$scriptVersion"
|
||||||
|
label="Inst-v$scriptVersion"
|
||||||
|
|
||||||
|
log_location="/private/var/log/Installomator.log"
|
||||||
|
printlog(){
|
||||||
|
timestamp=$(date +%F\ %T)
|
||||||
|
if [[ "$(whoami)" == "root" ]]; then
|
||||||
|
echo "$timestamp :: $label : $1" | tee -a $log_location
|
||||||
|
else
|
||||||
|
echo "$timestamp :: $label : $1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
printlog "[LOG-BEGIN] ${log_message}"
|
||||||
|
|
||||||
|
# Internet check
|
||||||
|
if [[ "$(nc -z -v -G 10 1.1.1.1 53 2>&1 | grep -io "succeeded")" != "succeeded" ]]; then
|
||||||
|
printlog "ERROR. No internet connection, we cannot continue."
|
||||||
|
exit 90
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid" || true
|
||||||
|
pkill caffeinate || true
|
||||||
|
printlog "[LOG-END] Status $1"
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
name="Installomator"
|
||||||
|
printlog "$name check for installation"
|
||||||
|
# download URL, version and Expected Team ID
|
||||||
|
# Method for GitHub pkg
|
||||||
|
gitusername="Installomator"
|
||||||
|
gitreponame="Installomator"
|
||||||
|
#printlog "$gitusername $gitreponame"
|
||||||
|
filetype="pkg"
|
||||||
|
downloadURL="https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)"
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
#printlog "$downloadURL"
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
#printlog "$appNewVersion"
|
||||||
|
expectedTeamID="JME5BW3F3R"
|
||||||
|
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
currentInstalledVersion="$(${destFile} version 2>/dev/null || true)"
|
||||||
|
printlog "${destFile} version: $currentInstalledVersion"
|
||||||
|
if [[ ! -e "${destFile}" || "$currentInstalledVersion" != "$appNewVersion" ]]; then
|
||||||
|
printlog "$name not found or version not latest."
|
||||||
|
printlog "${destFile}"
|
||||||
|
printlog "Installing version ${appNewVersion} ..."
|
||||||
|
# Create temporary working directory
|
||||||
|
tmpDir="$(mktemp -d || true)"
|
||||||
|
printlog "Created working directory '$tmpDir'"
|
||||||
|
# Download the installer package
|
||||||
|
printlog "Downloading $name package version $appNewVersion from: $downloadURL"
|
||||||
|
installationCount=0
|
||||||
|
exitCode=9
|
||||||
|
while [[ $installationCount -lt 3 && $exitCode -gt 0 ]]; do
|
||||||
|
curlDownload=$(curl -Ls "$downloadURL" -o "$tmpDir/$name.pkg" || true)
|
||||||
|
curlDownloadStatus=$(echo $?)
|
||||||
|
if [[ $curlDownloadStatus -ne 0 ]]; then
|
||||||
|
printlog "error downloading $downloadURL, with status $curlDownloadStatus"
|
||||||
|
printlog "${curlDownload}"
|
||||||
|
exitCode=1
|
||||||
|
else
|
||||||
|
printlog "Download $name succes."
|
||||||
|
# Verify the download
|
||||||
|
teamID=$(spctl -a -vv -t install "$tmpDir/$name.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()' || true)
|
||||||
|
printlog "Team ID for downloaded package: $teamID"
|
||||||
|
# Install the package if Team ID validates
|
||||||
|
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
||||||
|
printlog "$name package verified. Installing package '$tmpDir/$name.pkg'."
|
||||||
|
pkgInstall=$(installer -verbose -dumplog -pkg "$tmpDir/$name.pkg" -target "/" 2>&1)
|
||||||
|
pkgInstallStatus=$(echo $?)
|
||||||
|
if [[ $pkgInstallStatus -ne 0 ]]; then
|
||||||
|
printlog "ERROR. $name package installation failed."
|
||||||
|
printlog "${pkgInstall}"
|
||||||
|
exitCode=2
|
||||||
|
else
|
||||||
|
printlog "Installing $name package succes."
|
||||||
|
exitCode=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "ERROR. Package verification failed for $name before package installation could start. Download link may be invalid."
|
||||||
|
exitCode=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
((installationCount++))
|
||||||
|
printlog "$installationCount time(s), exitCode $exitCode"
|
||||||
|
if [[ $installationCount -lt 3 ]]; then
|
||||||
|
if [[ $exitCode -gt 0 ]]; then
|
||||||
|
printlog "Sleep a bit before trying download and install again. $installationCount time(s)."
|
||||||
|
printlog "Remove $(rm -fv "$tmpDir/$name.pkg" || true)"
|
||||||
|
sleep 2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "Download and install of $name succes."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# Remove the temporary working directory
|
||||||
|
printlog "Deleting working directory '$tmpDir' and its contents."
|
||||||
|
printlog "Remove $(rm -Rfv "${tmpDir}" || true)"
|
||||||
|
# Handle installation errors
|
||||||
|
if [[ $exitCode != 0 ]]; then
|
||||||
|
printlog "ERROR. Installation of $name failed. Aborting."
|
||||||
|
caffexit $exitCode
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion installed!"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
printlog "$name version $appNewVersion already found. Perfect!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
caffexit 0
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
#!/bin/zsh
|
|
||||||
# Installation using Installomator
|
|
||||||
what="brave" # enter the software to install
|
|
||||||
|
|
||||||
# To be used as a script sent out from a MDM.
|
|
||||||
# Fill the variable "what" above with a label.
|
|
||||||
# Script will run this label.
|
|
||||||
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
|
|
||||||
######################################################################
|
|
||||||
# Parameters for reinstall/initial install (owner root:wheel):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
|
|
||||||
# Parameters for Self Service installed app:
|
|
||||||
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
|
|
||||||
# Parameters for security important apps, like browsers (run automaticaly every day):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
|
|
||||||
# Update of service apps (run automatically):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
|
|
||||||
parameters="BLOCKING_PROCESS_ACTION=tell_user_then_kill NOTIFY=all"
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
cmdOutput="$(${destFile} ${what} LOGO=$LOGO $parameters LOGGING=WARN || true)"
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -ne 0 ]] ; then
|
|
||||||
echo -e "Error installing ${what}. Exit code ${exitStatus}"
|
|
||||||
#echo "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
echo "Error installing ${what}. Exit code $?"
|
|
||||||
caffexit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
|
|
||||||
caffexit 0
|
|
||||||
|
|
||||||
# notify behavior
|
|
||||||
# NOTIFY=success
|
|
||||||
# options:
|
|
||||||
# - success notify the user on success
|
|
||||||
# - silent no notifications
|
|
||||||
# - all all notifications (great for Self Service installation)
|
|
||||||
|
|
||||||
|
|
||||||
# behavior when blocking processes are found
|
|
||||||
# BLOCKING_PROCESS_ACTION=tell_user
|
|
||||||
# options:
|
|
||||||
# - ignore continue even when blocking processes are found
|
|
||||||
# - quit app will be told to quit nicely, if running
|
|
||||||
# - quit_kill told to quit twice, then it will be killed
|
|
||||||
# Could be great for service apps, if they do not respawn
|
|
||||||
# - silent_fail exit script without prompt or installation
|
|
||||||
# - prompt_user show a user dialog for each blocking process found
|
|
||||||
# abort after three attempts to quit
|
|
||||||
# (only if user accepts to quit the apps, otherwise
|
|
||||||
# the update is cancelled).
|
|
||||||
# - prompt_user_then_kill
|
|
||||||
# show a user dialog for each blocking process found,
|
|
||||||
# attempt to quit two times, kill the process finally
|
|
||||||
# - prompt_user_loop
|
|
||||||
# Like prompt-user, but clicking "Not Now", will just wait an hour,
|
|
||||||
# and then it will ask again.
|
|
||||||
# WARNING! It might block the MDM agent on the machine, as
|
|
||||||
# the scripts gets stuct in waiting until the hour has passed,
|
|
||||||
# possibly blocking for other management actions in this time.
|
|
||||||
# - tell_user User will be showed a notification about the important update,
|
|
||||||
# but user is only allowed to quit and continue, and then we
|
|
||||||
# ask the app to quit.
|
|
||||||
# - tell_user_then_kill
|
|
||||||
# Show dialog 2 times, and if the quitting fails, the
|
|
||||||
# blocking processes will be killed.
|
|
||||||
# - kill kill process without prompting or giving the user a chance to save
|
|
||||||
|
|
||||||
|
|
||||||
# logo-icon used in dialog boxes if app is blocking
|
|
||||||
# LOGO=appstore
|
|
||||||
# options:
|
|
||||||
# - appstore Icon is Apple App Store (default)
|
|
||||||
# - jamf JAMF Pro
|
|
||||||
# - mosyleb Mosyle Business
|
|
||||||
# - mosylem Mosyle Manager (Education)
|
|
||||||
# - addigy Addigy
|
|
||||||
# path can also be set in the command call, and if file exists, it will be used.
|
|
||||||
# Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
|
|
||||||
# (spaces have to be escaped).
|
|
||||||
|
|
||||||
|
|
||||||
# App Store apps handling
|
|
||||||
# IGNORE_APP_STORE_APPS=no
|
|
||||||
# options:
|
|
||||||
# - no If installed app is from App Store (which include VPP installed apps)
|
|
||||||
# it will not be touched, no matter it's version (default)
|
|
||||||
# - yes Replace App Store (and VPP) version of app and handle future
|
|
||||||
# updates using Installomator, even if latest version.
|
|
||||||
# Shouldn’t give any problems for the user in most cases.
|
|
||||||
# Known bad example: Slack will loose all settings.
|
|
||||||
|
|
||||||
|
|
||||||
# install behavior
|
|
||||||
# INSTALL=""
|
|
||||||
# options:
|
|
||||||
# - When not set, software will only be installed
|
|
||||||
# if it is newer/different in version
|
|
||||||
# - force Install even if it’s the same version
|
|
||||||
|
|
||||||
|
|
||||||
# Re-opening of closed app
|
|
||||||
# REOPEN="yes"
|
|
||||||
# options:
|
|
||||||
# - yes App wil be reopened if it was closed
|
|
||||||
# - no App not reopened
|
|
||||||
|
|
||||||
|
|
||||||
########################
|
|
||||||
# Often used labels:
|
|
||||||
########################
|
|
||||||
|
|
||||||
# firefox
|
|
||||||
# firefox_intl
|
|
||||||
# brave
|
|
||||||
# torbrowser
|
|
||||||
# googlechrome
|
|
||||||
# netnewswire
|
|
||||||
|
|
||||||
# adobereaderdc
|
|
||||||
# textmate
|
|
||||||
|
|
||||||
# cyberduck
|
|
||||||
# keka
|
|
||||||
# theunarchiver
|
|
||||||
|
|
||||||
# vlc
|
|
||||||
# handbrake
|
|
||||||
|
|
||||||
# inkscape
|
|
||||||
|
|
||||||
# signal
|
|
||||||
# telegram
|
|
||||||
# whatsapp
|
|
||||||
|
|
||||||
# hazel
|
|
||||||
# devonthink
|
|
||||||
|
|
||||||
# teamviewerqs
|
|
||||||
# zoom
|
|
||||||
|
|
||||||
# malwarebytes
|
|
||||||
# githubdesktop
|
|
||||||
# sublimetext
|
|
||||||
# textmate
|
|
||||||
# visualstudiocode
|
|
||||||
|
|
||||||
# microsoftskypeforbusiness
|
|
||||||
# microsoftteams
|
|
||||||
# microsoftyammer
|
|
||||||
# microsoftedgeenterprisestable
|
|
||||||
# microsoftedgeconsumerstable
|
|
||||||
# microsoftsharepointplugin
|
|
||||||
# microsoftdefenderatp
|
|
||||||
|
|
||||||
# googledrivefilestream
|
|
||||||
|
|
||||||
# cdef
|
|
||||||
# desktoppr
|
|
||||||
# supportapp
|
|
||||||
# xink
|
|
||||||
# wwdc
|
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Addigy condition
|
||||||
|
# These are my notes for how I can extract all the label lines from Installomator.sh, evaluate those, and check if installed version is the latest version.
|
||||||
|
# This script contains functions from Installomator.
|
||||||
|
label="googlechromepkg"
|
||||||
|
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
# Functions from Installomator
|
||||||
|
downloadURLFromGit() { # $1 git user name, $2 git repo name
|
||||||
|
gitusername=${1?:"no git user name"}
|
||||||
|
gitreponame=${2?:"no git repo name"}
|
||||||
|
|
||||||
|
if [[ $type == "pkgInDmg" ]]; then
|
||||||
|
filetype="dmg"
|
||||||
|
elif [[ $type == "pkgInZip" ]]; then
|
||||||
|
filetype="zip"
|
||||||
|
else
|
||||||
|
filetype=$type
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$archiveName" ]; then
|
||||||
|
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1)
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*$archiveName")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1)
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype")" == "" ]]; then
|
||||||
|
printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -z "$downloadURL" ]; then
|
||||||
|
cleanupAndExit 14 "could not retrieve download URL for $gitusername/$gitreponame" ERROR
|
||||||
|
else
|
||||||
|
echo "$downloadURL"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
versionFromGit() {
|
||||||
|
# credit: Søren Theilgaard (@theilgaard)
|
||||||
|
# $1 git user name, $2 git repo name
|
||||||
|
gitusername=${1?:"no git user name"}
|
||||||
|
gitreponame=${2?:"no git repo name"}
|
||||||
|
|
||||||
|
#appNewVersion=$(curl -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 -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g')
|
||||||
|
if [ -z "$appNewVersion" ]; then
|
||||||
|
printlog "could not retrieve version number for $gitusername/$gitreponame" WARN
|
||||||
|
appNewVersion=""
|
||||||
|
else
|
||||||
|
echo "$appNewVersion"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Handling of differences in xpath between Catalina and Big Sur
|
||||||
|
xpath() {
|
||||||
|
# the xpath tool changes in Big Sur and now requires the `-e` option
|
||||||
|
if [[ $(sw_vers -buildVersion) > "20A" ]]; then
|
||||||
|
/usr/bin/xpath -e $@
|
||||||
|
# alternative: switch to xmllint (which is not perl)
|
||||||
|
#xmllint --xpath $@ -
|
||||||
|
else
|
||||||
|
/usr/bin/xpath $@
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# from @Pico: https://macadmins.slack.com/archives/CGXNNJXJ9/p1652222365989229?thread_ts=1651786411.413349&cid=CGXNNJXJ9
|
||||||
|
getJSONValue() {
|
||||||
|
# $1: JSON string OR file path to parse (tested to work with up to 1GB string and 2GB file).
|
||||||
|
# $2: JSON key path to look up (using dot or bracket notation).
|
||||||
|
printf '%s' "$1" | /usr/bin/osascript -l 'JavaScript' \
|
||||||
|
-e "let json = $.NSString.alloc.initWithDataEncoding($.NSFileHandle.fileHandleWithStandardInput.readDataToEndOfFile$(/usr/bin/uname -r | /usr/bin/awk -F '.' '($1 > 18) { print "AndReturnError(ObjC.wrap())" }'), $.NSUTF8StringEncoding)" \
|
||||||
|
-e 'if ($.NSFileManager.defaultManager.fileExistsAtPath(json)) json = $.NSString.stringWithContentsOfFileEncodingError(json, $.NSUTF8StringEncoding, ObjC.wrap())' \
|
||||||
|
-e "const value = JSON.parse(json.js)$([ -n "${2%%[.[]*}" ] && echo '.')$2" \
|
||||||
|
-e 'if (typeof value === "object") { JSON.stringify(value, null, 4) } else { value }'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
labelScript=$(grep -E -m 1 -A 30 "^$label"'(\)|\|\\)$' "/usr/local/Installomator/Installomator.sh" | grep -B 30 -m 1 ";;")
|
||||||
|
echo $labelScript
|
||||||
|
eval $labelScript
|
||||||
|
echo $appNewVersion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##############################
|
||||||
|
printLines=0; while read line; do; if [[ $printLines -eq 1 || "$(echo $line | grep -oE "^googlechromepkg")" != "" ]]; then; printLines=1; echo $line; fi; done < "/usr/local/Installomator/Installomator.sh"
|
||||||
|
|
||||||
|
printLines=0; while read line; do; if [[ $printLines -eq 1 ]]; then; if [[ "$(echo $line | grep ";;")" == "" ]]; then; echo $line; else; printLines=0; fi ; elif [[ "$(echo $line | grep -oE "^googlechromepkg")" != "" ]]; then; printLines=1; fi; done < "/usr/local/Installomator/Installomator.sh"
|
||||||
|
|
||||||
|
labelLines="$(printLines=0; while read line; do; if [[ $printLines -eq 1 ]]; then; if [[ "$(echo $line | grep ";;")" == "" ]]; then; echo $line; else; return; fi ; elif [[ "$(echo $line | grep -oE "^googlechromepkg")" != "" ]]; then; printLines=1; fi; done < "/usr/local/Installomator/Installomator.sh")"; echo $labelLines
|
||||||
|
|
||||||
|
label="googlechromepkg";labelLines="$(printLines=0; while read line; do; if [[ $printLines -eq 1 ]]; then; if [[ "$(echo $line | grep ";;")" == "" ]]; then; echo $line; else; return; fi ; elif [[ "$(echo $line | grep -oE "^$label")" != "" ]]; then; printLines=1; fi; done < "/usr/local/Installomator/Installomator.sh")"; eval $labelLines ; echo $appNewVersion
|
||||||
|
|
||||||
|
|
||||||
|
label="googlechromepkg"
|
||||||
|
labelLines="$(printLines=0
|
||||||
|
while read line; do
|
||||||
|
if [[ $printLines -eq 1 ]]; then
|
||||||
|
if [[ "$(echo $label | grep ";;")" == "" ]]; then
|
||||||
|
echo $line
|
||||||
|
else
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
elif [[ "$(echo $line | grep -oE "^$label")" != "" ]]; then
|
||||||
|
printLines=1
|
||||||
|
fi
|
||||||
|
done < "/usr/local/Installomator/Installomator.sh")"
|
||||||
|
eval $labelLines
|
||||||
|
echo $appNewVersion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
279
MDM/App-install with Dialog and dockutil/App VFA SS github.sh
Executable file
279
MDM/App-install with Dialog and dockutil/App VFA SS github.sh
Executable file
@@ -0,0 +1,279 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
|
||||||
|
# Installation of software using `valuesfromarguments` to install a custom software using Installomator through GitHub
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
#item="gfxcardstatus" # enter the software to install (if it has a label in future version of Installomator)
|
||||||
|
|
||||||
|
# Label variables below
|
||||||
|
|
||||||
|
# GitHub functions
|
||||||
|
downloadURLFromGit() { # $1 git user name, $2 git repo name
|
||||||
|
gitusername=${1?:"no git user name"}
|
||||||
|
gitreponame=${2?:"no git repo name"}
|
||||||
|
|
||||||
|
if [[ $type == "pkgInDmg" ]]; then
|
||||||
|
filetype="dmg"
|
||||||
|
elif [[ $type == "pkgInZip" ]]; then
|
||||||
|
filetype="zip"
|
||||||
|
else
|
||||||
|
filetype=$type
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$archiveName" ]; then
|
||||||
|
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*$archiveName" | head -1 || true)
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*$archiveName" || true)" == "" ]]; then
|
||||||
|
#printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$archiveName\"/ { print \$4; exit }" || true)
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
downloadURL=https://github.com$(curl -sfL "https://github.com/$gitusername/$gitreponame/releases/latest" | tr '"' "\n" | grep -i "^/.*\/releases\/download\/.*\.$filetype" | head -1 || true)
|
||||||
|
if [[ "$(echo $downloadURL | grep -ioE "https.*.$filetype" || true)" == "" ]]; then
|
||||||
|
#printlog "Trying GitHub API for download URL."
|
||||||
|
downloadURL=$(curl -sfL "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | awk -F '"' "/browser_download_url/ && /$filetype\"/ { print \$4; exit }" || true)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -z "$downloadURL" ]; then
|
||||||
|
echo "could not retrieve download URL for $gitusername/$gitreponame"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "$downloadURL"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
versionFromGit() {
|
||||||
|
# credit: Søren Theilgaard (@theilgaard)
|
||||||
|
# $1 git user name, $2 git repo name
|
||||||
|
gitusername=${1?:"no git user name"}
|
||||||
|
gitreponame=${2?:"no git repo name"}
|
||||||
|
|
||||||
|
#appNewVersion=$(curl -L --silent --fail "https://api.github.com/repos/$gitusername/$gitreponame/releases/latest" | grep tag_name | cut -d '"' -f 4 | sed 's/[^0-9\.]//g' || true)
|
||||||
|
appNewVersion=$(curl -sLI "https://github.com/$gitusername/$gitreponame/releases/latest" | grep -i "^location" | tr "/" "\n" | tail -1 | sed 's/[^0-9\.]//g' || true)
|
||||||
|
if [ -z "$appNewVersion" ]; then
|
||||||
|
#echo "could not retrieve version number for $gitusername/$gitreponame"
|
||||||
|
appNewVersion=""
|
||||||
|
else
|
||||||
|
echo "$appNewVersion"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Variables for label
|
||||||
|
name="gfxCardStatus"
|
||||||
|
type="zip"
|
||||||
|
downloadURL="$(downloadURLFromGit codykrieger gfxCardStatus)"
|
||||||
|
appNewVersion="$(versionFromGit codykrieger gfxCardStatus)"
|
||||||
|
expectedTeamID="LF22FTQC25"
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon=""
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPath="/Applications/$name.app"
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : github-functions added. Improved appIcon handling. Can add the app to Dock using dockutil.
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
#itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
itemName="$name"
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
|
||||||
|
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
|
||||||
|
appIcon="${appIcon}.icns"
|
||||||
|
fi
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator with valuesfromarguments
|
||||||
|
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
|
||||||
|
name=${name} \
|
||||||
|
type=${type} \
|
||||||
|
downloadURL=\"$downloadURL\" \
|
||||||
|
appNewVersion=${appNewVersion} \
|
||||||
|
expectedTeamID=${expectedTeamID} \
|
||||||
|
${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
227
MDM/App-install with Dialog and dockutil/App VFA SS.sh
Executable file
227
MDM/App-install with Dialog and dockutil/App VFA SS.sh
Executable file
@@ -0,0 +1,227 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
|
||||||
|
# Installation of software using `valuesfromarguments` to install a custom software using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
#item="" # enter the software to install (if it has a label in future version of Installomator)
|
||||||
|
|
||||||
|
# Variables for label
|
||||||
|
name="ClickShare"
|
||||||
|
type="appInDmgInZip"
|
||||||
|
downloadURL="https://www.barco.com$( curl -fs "https://www.barco.com/en/clickshare/app" | grep -A6 -i "macos" | grep -i "FileNumber" | tr '"' "\n" | grep -i "FileNumber" )"
|
||||||
|
appNewVersion="$(eval "$( echo $downloadURL | sed -E 's/.*(MajorVersion.*BuildVersion=[0-9]*).*/\1/' | sed 's/&//g' )" ; ((MajorVersion++)) ; ((MajorVersion--)); ((MinorVersion++)) ; ((MinorVersion--)); ((PatchVersion++)) ; ((PatchVersion--)); ((BuildVersion++)) ; ((BuildVersion--)); echo "${MajorVersion}.${MinorVersion}.${PatchVersion}-b${BuildVersion}")"
|
||||||
|
expectedTeamID="P6CDJZR997"
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon=""
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPath="/Applications/$name.app"
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : Improved appIcon handling. Can add the app to Dock using dockutil
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
#destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
destFile="/usr/local/Installomator/Installomator10.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
#itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
itemName="$name"
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
|
||||||
|
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
|
||||||
|
appIcon="${appIcon}.icns"
|
||||||
|
fi
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator with valuesfromarguments
|
||||||
|
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
|
||||||
|
name=${name} \
|
||||||
|
type=${type} \
|
||||||
|
downloadURL=\"$downloadURL\" \
|
||||||
|
appNewVersion=${appNewVersion} \
|
||||||
|
expectedTeamID=${expectedTeamID} \
|
||||||
|
${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
211
MDM/App-install with Dialog and dockutil/App browser-security.sh
Executable file
211
MDM/App-install with Dialog and dockutil/App browser-security.sh
Executable file
@@ -0,0 +1,211 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
item="firefoxpkg" # enter the software to install
|
||||||
|
# Examples: microsoftedge, brave, googlechromepkg, firefoxpkg
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon="https://mosylebusinessweb.blob.core.windows.net/envoit-public/customcommand_icon-envoit_3e37cc23e3fd8d29b1fbe85bc3b3923b323627dc83153cf673.png"
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPath="/Applications/Firefox.app"
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : Improved appIcon handling. Can add the app to Dock using dockutil
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
|
||||||
|
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
|
||||||
|
appIcon="${appIcon}.icns"
|
||||||
|
fi
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
@@ -0,0 +1,214 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
item="microsoftoffice365" # enter the software to install
|
||||||
|
# Examples: microsoftedge, brave, googlechromepkg, firefoxpkg
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon=""
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPaths=("/Applications/Microsoft Outlook.app" "/Applications/Microsoft Word.app" "/Applications/Microsoft Excel.app" "/Applications/Microsoft PowerPoint.app" "/Applications/Microsoft OneNote.app")
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : Improved appIcon handling. Can add the app to Dock using dockutil
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
|
||||||
|
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
|
||||||
|
appIcon="${appIcon}.icns"
|
||||||
|
fi
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
for appPath in "${appPaths[@]}"; do
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" --no-restart || true
|
||||||
|
done
|
||||||
|
$dockutil --add "/AppThatDoesNotExistAnywhereOnDiskButMakingDockutilRestartTheDock" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
211
MDM/App-install with Dialog and dockutil/App normal SS.sh
Normal file
211
MDM/App-install with Dialog and dockutil/App normal SS.sh
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator with Dialog showing progress (and posibility of adding to the Dock)
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
item="" # enter the software to install
|
||||||
|
# Examples: microsoftedge, brave, googlechromepkg, firefoxpkg
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon=""
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPath="/Applications/.app"
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : Improved appIcon handling. Can add the app to Dock using dockutil
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1 || true)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile || true)
|
||||||
|
if [[ "$(echo "$appIcon" | grep -io ".icns")" == "" ]]; then
|
||||||
|
appIcon="${appIcon}.icns"
|
||||||
|
fi
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
93
MDM/App-install/App VFA.sh
Executable file
93
MDM/App-install/App VFA.sh
Executable file
@@ -0,0 +1,93 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
# Installation of software using valuesfromarguments to install a custom software using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
#item="" # enter the software to install (if it has a label in future version of Installomator)
|
||||||
|
|
||||||
|
# Variables for label
|
||||||
|
name="ClickShare"
|
||||||
|
type="appInDmgInZip"
|
||||||
|
downloadURL="https://www.barco.com$( curl -fs "https://www.barco.com/en/clickshare/app" | grep -A6 -i "macos" | grep -i "FileNumber" | tr '"' "\n" | grep -i "FileNumber" )"
|
||||||
|
appNewVersion="$(eval "$( echo $downloadURL | sed -E 's/.*(MajorVersion.*BuildVersion=[0-9]*).*/\1/' | sed 's/&//g' )" ; ((MajorVersion++)) ; ((MajorVersion--)); ((MinorVersion++)) ; ((MinorVersion--)); ((PatchVersion++)) ; ((PatchVersion--)); ((BuildVersion++)) ; ((BuildVersion--)); echo "${MajorVersion}.${MinorVersion}.${PatchVersion}-b${BuildVersion}")"
|
||||||
|
expectedTeamID="P6CDJZR997"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user LOGGING=INFO NOTIFY=all" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "what" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install software using Installomator with valuesfromarguments
|
||||||
|
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
|
||||||
|
name=${name} \
|
||||||
|
type=${type} \
|
||||||
|
downloadURL=\"$downloadURL\" \
|
||||||
|
appNewVersion=${appNewVersion} \
|
||||||
|
expectedTeamID=${expectedTeamID} \
|
||||||
|
${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${what} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${what}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
79
MDM/App-install/App browser-security Auto-install.sh
Normal file
79
MDM/App-install/App browser-security Auto-install.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what="firefoxpkg" # enter the software to install
|
||||||
|
# Examples: microsoftedge, brave, googlechromepkg, firefoxpkg
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "what" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${what} LOGO=$LOGO ${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${what} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${what}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
79
MDM/App-install/App browser-security SS.sh
Normal file
79
MDM/App-install/App browser-security SS.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what="" # enter the software to install
|
||||||
|
# Examples: microsoftedge, brave, googlechromepkg, firefoxpkg
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user_then_quit NOTIFY=all" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "what" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${what} LOGO=$LOGO ${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${what} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${what}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
79
MDM/App-install/App normal Auto-install.sh
Normal file
79
MDM/App-install/App normal Auto-install.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what="" # enter the software to install
|
||||||
|
# Examples: adobecreativeclouddesktop, textmate, vlc
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=tell_user" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "what" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${what} LOGO=$LOGO ${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${what} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${what}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
79
MDM/App-install/App normal SS.sh
Normal file
79
MDM/App-install/App normal SS.sh
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
|
||||||
|
LOGO="mosyleb" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
what="" # enter the software to install
|
||||||
|
# Examples: adobecreativeclouddesktop, textmate, vlc
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "what" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $what"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${what} LOGO=$LOGO ${installomatorOptions} || true)"
|
||||||
|
|
||||||
|
# Check result
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${what} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${what}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
208
MDM/App-install/App service Auto-install.sh
Normal file
208
MDM/App-install/App service Auto-install.sh
Normal file
@@ -0,0 +1,208 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Installation using Installomator
|
||||||
|
|
||||||
|
LOGO="addigy" # "mosyleb", "mosylem", "addigy", "microsoft", "ws1"
|
||||||
|
|
||||||
|
item="xink" # enter the software to install
|
||||||
|
# Examples: desktoppr, dockutil, supportapp, applenyfonts, applesfpro, applesfmono, applesfcompact, nomad, nudge, shield, xink
|
||||||
|
|
||||||
|
# Dialog icon
|
||||||
|
icon=""
|
||||||
|
# icon should be a file system path or an URL to an online PNG.
|
||||||
|
# In Mosyle an URL can be found by copy picture address from a Custom Command icon.
|
||||||
|
|
||||||
|
# dockutil variables
|
||||||
|
addToDock="1" # with dockutil after installation (0 if not)
|
||||||
|
appPath="/Applications/Xink.app"
|
||||||
|
|
||||||
|
# Other variables
|
||||||
|
dialog_command_file="/var/tmp/dialog.log"
|
||||||
|
dialogApp="/Library/Application Support/Dialog/Dialog.app"
|
||||||
|
dockutil="/usr/local/bin/dockutil"
|
||||||
|
|
||||||
|
installomatorOptions="BLOCKING_PROCESS_ACTION=ignore NOTIFY=silent DIALOG_CMD_FILE=${dialog_command_file}" # Separated by space
|
||||||
|
|
||||||
|
# Other installomatorOptions:
|
||||||
|
# LOGGING=REQ
|
||||||
|
# LOGGING=DEBUG
|
||||||
|
# LOGGING=WARN
|
||||||
|
# BLOCKING_PROCESS_ACTION=ignore
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=tell_user_then_quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_loop
|
||||||
|
# BLOCKING_PROCESS_ACTION=prompt_user_then_kill
|
||||||
|
# BLOCKING_PROCESS_ACTION=quit
|
||||||
|
# BLOCKING_PROCESS_ACTION=kill
|
||||||
|
# NOTIFY=all
|
||||||
|
# NOTIFY=success
|
||||||
|
# NOTIFY=silent
|
||||||
|
# IGNORE_APP_STORE_APPS=yes
|
||||||
|
# INSTALL=force
|
||||||
|
######################################################################
|
||||||
|
# To be used as a script sent out from a MDM.
|
||||||
|
# Fill the variable "item" above with a label.
|
||||||
|
# Script will run this label through Installomator.
|
||||||
|
######################################################################
|
||||||
|
# v. 10.1 : Can add the app to Dock using dockutil
|
||||||
|
# v. 10 : Integration with Dialog and Installomator v. 10
|
||||||
|
# v. 9.3 : Better logging handling and installomatorOptions fix.
|
||||||
|
######################################################################
|
||||||
|
|
||||||
|
# Mark: Script
|
||||||
|
# PATH declaration
|
||||||
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
||||||
|
|
||||||
|
echo "$(date +%F\ %T) [LOG-BEGIN] $item"
|
||||||
|
|
||||||
|
dialogUpdate() {
|
||||||
|
# $1: dialog command
|
||||||
|
local dcommand="$1"
|
||||||
|
|
||||||
|
if [[ -n $dialog_command_file ]]; then
|
||||||
|
echo "$dcommand" >> "$dialog_command_file"
|
||||||
|
echo "Dialog: $dcommand"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
checkCmdOutput () {
|
||||||
|
# $1: cmdOutput
|
||||||
|
local cmdOutput="$1"
|
||||||
|
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
||||||
|
if [[ ${exitStatus} -eq 0 ]] ; then
|
||||||
|
echo "${item} succesfully installed."
|
||||||
|
warnOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "warn" || true )"
|
||||||
|
echo "$warnOutput"
|
||||||
|
else
|
||||||
|
echo "ERROR installing ${item}. Exit code ${exitStatus}"
|
||||||
|
echo "$cmdOutput"
|
||||||
|
#errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
||||||
|
#echo "$errorOutput"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check the currently logged in user
|
||||||
|
currentUser=$(stat -f "%Su" /dev/console)
|
||||||
|
if [ -z "$currentUser" ] || [ "$currentUser" = "loginwindow" ] || [ "$currentUser" = "_mbsetupuser" ] || [ "$currentUser" = "root" ]; then
|
||||||
|
echo "ERROR. Logged in user is $currentUser! Cannot proceed."
|
||||||
|
exit 97
|
||||||
|
fi
|
||||||
|
# Get the current user's UID for dockutil
|
||||||
|
uid=$(id -u "$currentUser")
|
||||||
|
# Find the home folder of the user
|
||||||
|
userHome="$(dscl . -read /users/${currentUser} NFSHomeDirectory | awk '{print $2}')"
|
||||||
|
|
||||||
|
# Verify that Installomator has been installed
|
||||||
|
destFile="/usr/local/Installomator/Installomator.sh"
|
||||||
|
if [ ! -e "${destFile}" ]; then
|
||||||
|
echo "Installomator not found here:"
|
||||||
|
echo "${destFile}"
|
||||||
|
echo "Exiting."
|
||||||
|
exit 99
|
||||||
|
fi
|
||||||
|
|
||||||
|
# No sleeping
|
||||||
|
/usr/bin/caffeinate -d -i -m -u &
|
||||||
|
caffeinatepid=$!
|
||||||
|
caffexit () {
|
||||||
|
kill "$caffeinatepid"
|
||||||
|
pkill caffeinate
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mark: Installation begins
|
||||||
|
installomatorVersion="$(${destFile} version | cut -d "." -f1 || true)"
|
||||||
|
|
||||||
|
if [[ $installomatorVersion -lt 10 ]] || [[ $(sw_vers -buildVersion) < "20A" ]]; then
|
||||||
|
echo "Installomator should be at least version 10 to support Dialog. Installed version $installomatorVersion."
|
||||||
|
echo "And macOS 11 Big Sur (build 20A) is required for Dialog. Installed build $(sw_vers -buildVersion)."
|
||||||
|
installomatorNotify="NOTIFY=all"
|
||||||
|
else
|
||||||
|
installomatorNotify=""
|
||||||
|
# check for Swift Dialog
|
||||||
|
if [[ ! -d $dialogApp ]]; then
|
||||||
|
echo "Cannot find dialog at $dialogApp"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dialog LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure and display swiftDialog
|
||||||
|
itemName=$( ${destFile} ${item} RETURN_LABEL_NAME=1 LOGGING=REQ INSTALL=force | tail -1 || true )
|
||||||
|
if [[ "$itemName" != "#" ]]; then
|
||||||
|
message="Installing ${itemName}…"
|
||||||
|
else
|
||||||
|
message="Installing ${item}…"
|
||||||
|
fi
|
||||||
|
echo "$item $itemName"
|
||||||
|
|
||||||
|
# If no icon defined we are trying to search for installed app icon
|
||||||
|
if [[ "$icon" == "" ]]; then
|
||||||
|
appPath=$(mdfind "kind:application AND name:$itemName" | head -1)
|
||||||
|
appIcon=$(defaults read "${appPath}/Contents/Info.plist" CFBundleIconFile)
|
||||||
|
icon="${appPath}/Contents/Resources/${appIcon}"
|
||||||
|
echo "${icon}"
|
||||||
|
if [ ! -f "${icon}" ]; then
|
||||||
|
icon="/System/Applications/App Store.app/Contents/Resources/AppIcon.icns"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo "${icon}"
|
||||||
|
|
||||||
|
# display first screen
|
||||||
|
open -a "$dialogApp" --args \
|
||||||
|
--title none \
|
||||||
|
--icon "$icon" \
|
||||||
|
--message "$message" \
|
||||||
|
--mini \
|
||||||
|
--progress 100 \
|
||||||
|
--position bottomright \
|
||||||
|
--movable \
|
||||||
|
--commandfile "$dialog_command_file"
|
||||||
|
|
||||||
|
# give everything a moment to catch up
|
||||||
|
sleep 0.1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install software using Installomator
|
||||||
|
cmdOutput="$(${destFile} ${item} LOGO=$LOGO ${installomatorOptions} ${installomatorNotify} || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
|
||||||
|
# Mark: dockutil stuff
|
||||||
|
if [[ $addToDock -eq 1 ]]; then
|
||||||
|
dialogUpdate "progresstext: Adding to Dock"
|
||||||
|
if [[ ! -d $dockutil ]]; then
|
||||||
|
echo "Cannot find dockutil at $dockutil, trying installation"
|
||||||
|
# Install using Installlomator
|
||||||
|
cmdOutput="$(${destFile} dockutil LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore LOGGING=REQ NOTIFY=silent || true)"
|
||||||
|
checkCmdOutput $cmdOutput
|
||||||
|
fi
|
||||||
|
echo "Adding to Dock"
|
||||||
|
$dockutil --add "${appPath}" "${userHome}/Library/Preferences/com.apple.dock.plist" || true
|
||||||
|
sleep 1
|
||||||
|
else
|
||||||
|
echo "Not adding to Dock."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark: Ending
|
||||||
|
if [[ $installomatorVersion -lt 10 ]]; then
|
||||||
|
echo "Again skipping Dialog stuff."
|
||||||
|
else
|
||||||
|
# close and quit dialog
|
||||||
|
dialogUpdate "progress: complete"
|
||||||
|
dialogUpdate "progresstext: Done"
|
||||||
|
|
||||||
|
# pause a moment
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
dialogUpdate "quit:"
|
||||||
|
|
||||||
|
# let everything catch up
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# just to be safe
|
||||||
|
#killall "Dialog" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[$(DATE)][LOG-END]"
|
||||||
|
|
||||||
|
caffexit $exitStatus
|
||||||
@@ -1,193 +0,0 @@
|
|||||||
#!/bin/zsh
|
|
||||||
# Installation using Installomator
|
|
||||||
whatList="microsoftteams microsoftyammer firefox bravebrowser cyberduck vlc signal" # enter the software to install separated with spaces
|
|
||||||
|
|
||||||
# To be used as a script sent out from a MDM.
|
|
||||||
# Fill the variable "whatList" above with labels separated by space " ".
|
|
||||||
# Script will loop through these labels.
|
|
||||||
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
|
|
||||||
######################################################################
|
|
||||||
# Parameters for reinstall/initial install (owner root:wheel):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
|
|
||||||
# Parameters for Self Service installed app:
|
|
||||||
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
|
|
||||||
# Parameters for security important apps, like browsers (run automaticaly every day):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
|
|
||||||
# Update of service apps (run automatically):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
|
|
||||||
parameters="BLOCKING_PROCESS_ACTION=tell_user NOTIFY=all"
|
|
||||||
######################################################################
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Count errors
|
|
||||||
errorCount=0
|
|
||||||
|
|
||||||
for what in $whatList; do
|
|
||||||
#echo $what
|
|
||||||
# Install software using Installomator
|
|
||||||
cmdOutput="$(${destFile} ${what} LOGO=$LOGO $parameters LOGGING=WARN || true)"
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -ne 0 ]] ; then
|
|
||||||
echo -e "Error installing ${what}. Exit code ${exitStatus}"
|
|
||||||
#echo "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
let errorCount++
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Errors: $errorCount"
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
|
|
||||||
caffexit $errorCount
|
|
||||||
|
|
||||||
# notify behavior
|
|
||||||
# NOTIFY=success
|
|
||||||
# options:
|
|
||||||
# - success notify the user on success
|
|
||||||
# - silent no notifications
|
|
||||||
# - all all notifications (great for Self Service installation)
|
|
||||||
|
|
||||||
|
|
||||||
# behavior when blocking processes are found
|
|
||||||
# BLOCKING_PROCESS_ACTION=tell_user
|
|
||||||
# options:
|
|
||||||
# - ignore continue even when blocking processes are found
|
|
||||||
# - quit app will be told to quit nicely, if running
|
|
||||||
# - quit_kill told to quit twice, then it will be killed
|
|
||||||
# Could be great for service apps, if they do not respawn
|
|
||||||
# - silent_fail exit script without prompt or installation
|
|
||||||
# - prompt_user show a user dialog for each blocking process found
|
|
||||||
# abort after three attempts to quit
|
|
||||||
# (only if user accepts to quit the apps, otherwise
|
|
||||||
# the update is cancelled).
|
|
||||||
# - prompt_user_then_kill
|
|
||||||
# show a user dialog for each blocking process found,
|
|
||||||
# attempt to quit two times, kill the process finally
|
|
||||||
# - prompt_user_loop
|
|
||||||
# Like prompt-user, but clicking "Not Now", will just wait an hour,
|
|
||||||
# and then it will ask again.
|
|
||||||
# WARNING! It might block the MDM agent on the machine, as
|
|
||||||
# the scripts gets stuct in waiting until the hour has passed,
|
|
||||||
# possibly blocking for other management actions in this time.
|
|
||||||
# - tell_user User will be showed a notification about the important update,
|
|
||||||
# but user is only allowed to quit and continue, and then we
|
|
||||||
# ask the app to quit.
|
|
||||||
# - tell_user_then_kill
|
|
||||||
# Show dialog 2 times, and if the quitting fails, the
|
|
||||||
# blocking processes will be killed.
|
|
||||||
# - kill kill process without prompting or giving the user a chance to save
|
|
||||||
|
|
||||||
|
|
||||||
# logo-icon used in dialog boxes if app is blocking
|
|
||||||
# LOGO=appstore
|
|
||||||
# options:
|
|
||||||
# - appstore Icon is Apple App Store (default)
|
|
||||||
# - jamf JAMF Pro
|
|
||||||
# - mosyleb Mosyle Business
|
|
||||||
# - mosylem Mosyle Manager (Education)
|
|
||||||
# - addigy Addigy
|
|
||||||
# path can also be set in the command call, and if file exists, it will be used.
|
|
||||||
# Like 'LOGO="/System/Applications/App\ Store.app/Contents/Resources/AppIcon.icns"'
|
|
||||||
# (spaces have to be escaped).
|
|
||||||
|
|
||||||
|
|
||||||
# App Store apps handling
|
|
||||||
# IGNORE_APP_STORE_APPS=no
|
|
||||||
# options:
|
|
||||||
# - no If installed app is from App Store (which include VPP installed apps)
|
|
||||||
# it will not be touched, no matter it's version (default)
|
|
||||||
# - yes Replace App Store (and VPP) version of app and handle future
|
|
||||||
# updates using Installomator, even if latest version.
|
|
||||||
# Shouldn’t give any problems for the user in most cases.
|
|
||||||
# Known bad example: Slack will loose all settings.
|
|
||||||
|
|
||||||
|
|
||||||
# install behavior
|
|
||||||
# INSTALL=""
|
|
||||||
# options:
|
|
||||||
# - When not set, software will only be installed
|
|
||||||
# if it is newer/different in version
|
|
||||||
# - force Install even if it’s the same version
|
|
||||||
|
|
||||||
|
|
||||||
# Re-opening of closed app
|
|
||||||
# REOPEN="yes"
|
|
||||||
# options:
|
|
||||||
# - yes App wil be reopened if it was closed
|
|
||||||
# - no App not reopened
|
|
||||||
|
|
||||||
|
|
||||||
########################
|
|
||||||
# Often used labels:
|
|
||||||
########################
|
|
||||||
|
|
||||||
# firefox
|
|
||||||
# firefox_intl
|
|
||||||
# brave
|
|
||||||
# torbrowser
|
|
||||||
# googlechrome
|
|
||||||
# netnewswire
|
|
||||||
|
|
||||||
# adobereaderdc
|
|
||||||
# textmate
|
|
||||||
|
|
||||||
# cyberduck
|
|
||||||
# keka
|
|
||||||
# theunarchiver
|
|
||||||
|
|
||||||
# vlc
|
|
||||||
# handbrake
|
|
||||||
|
|
||||||
# inkscape
|
|
||||||
|
|
||||||
# signal
|
|
||||||
# telegram
|
|
||||||
# whatsapp
|
|
||||||
|
|
||||||
# hazel
|
|
||||||
# devonthink
|
|
||||||
|
|
||||||
# teamviewerqs
|
|
||||||
# zoom
|
|
||||||
|
|
||||||
# malwarebytes
|
|
||||||
# githubdesktop
|
|
||||||
# sublimetext
|
|
||||||
# textmate
|
|
||||||
# visualstudiocode
|
|
||||||
|
|
||||||
# microsoftskypeforbusiness
|
|
||||||
# microsoftteams
|
|
||||||
# microsoftyammer
|
|
||||||
# microsoftedgeenterprisestable
|
|
||||||
# microsoftedgeconsumerstable
|
|
||||||
# microsoftsharepointplugin
|
|
||||||
# microsoftdefenderatp
|
|
||||||
|
|
||||||
# googledrivefilestream
|
|
||||||
|
|
||||||
# cdef
|
|
||||||
# desktoppr
|
|
||||||
# supportapp
|
|
||||||
# xink
|
|
||||||
# wwdc
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# This script is meant to povide the simplest MDM/management platform agnostic way to install Installomator
|
|
||||||
# The only requirement is an Internet connection
|
|
||||||
|
|
||||||
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
|
||||||
|
|
||||||
# Get the URL of the latest PKG From the Installomator GitHub repo
|
|
||||||
url=$(curl --silent --fail "https://api.github.com/repos/Installomator/Installomator/releases/latest" | awk -F '"' "/browser_download_url/ && /pkg\"/ { print \$4; exit }")
|
|
||||||
# Expected Team ID of the downloaded PKG
|
|
||||||
expectedTeamID="JME5BW3F3R"
|
|
||||||
exitCode=0
|
|
||||||
|
|
||||||
# Check for Installomator and install if not found
|
|
||||||
if [ ! -e "/usr/local/Installomator/Installomator.sh" ]; then
|
|
||||||
echo "Installomator not found. Installing."
|
|
||||||
# Create temporary working directory
|
|
||||||
tempDirectory=$( mktemp -d )
|
|
||||||
echo "Created working directory '$tempDirectory'"
|
|
||||||
# Download the installer package
|
|
||||||
echo "Downloading Installomator package"
|
|
||||||
curl --location --silent "$url" -o "$tempDirectory/Installomator.pkg"
|
|
||||||
# Verify the download
|
|
||||||
teamID=$(spctl -a -vv -t install "$tempDirectory/Installomator.pkg" 2>&1 | awk '/origin=/ {print $NF }' | tr -d '()')
|
|
||||||
echo "Team ID for downloaded package: $teamID"
|
|
||||||
# Install the package if Team ID validates
|
|
||||||
if [ "$expectedTeamID" = "$teamID" ] || [ "$expectedTeamID" = "" ]; then
|
|
||||||
echo "Package verified. Installing package Installomator.pkg"
|
|
||||||
installer -pkg "$tempDirectory/Installomator.pkg" -target / -verbose
|
|
||||||
exitCode=$?
|
|
||||||
else
|
|
||||||
echo "Package verification failed before package installation could start. Download link may be invalid. Aborting."
|
|
||||||
exitCode=1
|
|
||||||
exit $exitCode
|
|
||||||
fi
|
|
||||||
# Remove the temporary working directory when done
|
|
||||||
echo "Deleting working directory '$tempDirectory' and its contents"
|
|
||||||
rm -Rf "$tempDirectory"
|
|
||||||
else
|
|
||||||
echo "Installomator already installed."
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit $exitCode
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Updating Installomator
|
|
||||||
# Usefull to push out after deployment if earlier version was deployed in DEP profile
|
|
||||||
|
|
||||||
what="installomator" # enter the software to install
|
|
||||||
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Install software using Installomator
|
|
||||||
cmdOutput="$(${destFile} ${what} LOGO=$LOGO BLOCKING_PROCESS_ACTION=ignore NOTIFY=silent LOGGING=req || true)"
|
|
||||||
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -eq 0 ]] ; then
|
|
||||||
echo -e "${what} succesfully installed.\n"
|
|
||||||
else
|
|
||||||
echo -e "Error installing ${what}. Exit code ${exitStatus}\n"
|
|
||||||
#echo "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
caffexit $exitStatus
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
caffexit 0
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
#!/bin/zsh
|
|
||||||
|
|
||||||
# Specific settings in Addigy to configure Custom Software for installomator.
|
|
||||||
# Addigy has 3 parts to fill out for this, Installation script, Condition, and Removal steps (see RemoveInstallomator.sh).
|
|
||||||
|
|
||||||
# Mark: Installation script
|
|
||||||
# Just click “Add” to autogenerate the installer script line by clicking the “Add”-button next to the Installer PKG, replace with first line below
|
|
||||||
/usr/sbin/installer -pkg "/Library/Addigy/ansible/packages/Installomator (9.1.0)/Installomator-9.1.pkg" -target /
|
|
||||||
|
|
||||||
# Installation using Installomator
|
|
||||||
whatList="supportapp xink textmate microsoftedge wwdc keka vlc " # enter the software to installed separated with spaces
|
|
||||||
|
|
||||||
# To be used as a script sent out from a MDM.
|
|
||||||
# Fill the variable "whatList" above with labels separated by space " ".
|
|
||||||
# Script will loop through these labels and exit with number of errors.
|
|
||||||
######################################################################
|
|
||||||
# Parameters for reinstall/initial install (owner root:wheel):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes SYSTEMOWNER=1"
|
|
||||||
# Parameters for Self Service installed app:
|
|
||||||
# "BLOCKING_PROCESS_ACTION=prompt_user NOTIFY=all"
|
|
||||||
# Parameters for security important apps, like browsers (run automaticaly every day):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=tell_user_then_kill"
|
|
||||||
# Update of service apps (run automatically):
|
|
||||||
# "BLOCKING_PROCESS_ACTION=quit_kill NOTIFY=silent"
|
|
||||||
parameters="BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force IGNORE_APP_STORE_APPS=yes"
|
|
||||||
######################################################################
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Count errors
|
|
||||||
errorCount=0
|
|
||||||
|
|
||||||
for what in $whatList; do
|
|
||||||
#echo $what
|
|
||||||
# Install software using Installomator
|
|
||||||
cmdOutput="$(${destFile} ${what} LOGO=addigy $parameters || true)"
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -ne 0 ]] ; then
|
|
||||||
echo -e "Error installing ${what}. Exit code ${exitStatus}"
|
|
||||||
#echo "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
let errorCount++
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Errors: $errorCount"
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
|
|
||||||
caffexit $errorCount
|
|
||||||
|
|
||||||
# Mark: Conditions
|
|
||||||
# Install on success
|
|
||||||
# Remember to fill out the correct “TARGET_VERSION” and “PKG_ID”, and click "Install on succes".
|
|
||||||
PKG_ID="com.scriptingosx.Installomator"
|
|
||||||
TARGET_VERSION="9.1"
|
|
||||||
|
|
||||||
vercomp () {
|
|
||||||
if [[ $1 == $2 ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
local IFS=.
|
|
||||||
local i ver1=($1) ver2=($2)
|
|
||||||
# fill empty fields in ver1 with zeros
|
|
||||||
for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
|
|
||||||
ver1[i]=0
|
|
||||||
done
|
|
||||||
for ((i=0; i<${#ver1[@]}; i++)); do
|
|
||||||
if [[ -z ${ver2[i]} ]]; then
|
|
||||||
# fill empty fields in ver2 with zeros
|
|
||||||
ver2[i]=0
|
|
||||||
fi
|
|
||||||
if ((10#${ver1[i]} > 10#${ver2[i]})); then
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
if ((10#${ver1[i]} < 10#${ver2[i]})); then
|
|
||||||
return 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
INSTALLED_VERSION="$(pkgutil --pkg-info $PKG_ID | grep -i "^version" | awk '{print $2}')"
|
|
||||||
|
|
||||||
echo "Current Version: ${INSTALLED_VERSION}"
|
|
||||||
|
|
||||||
vercomp ${TARGET_VERSION} ${INSTALLED_VERSION}
|
|
||||||
COMP=$? # 0 means the same, 1 means TARGET is newer, 2 means INSTALLED is newer
|
|
||||||
echo "COMPARISON: ${COMP}"
|
|
||||||
|
|
||||||
if [ "${COMP}" -eq 1 ]; then
|
|
||||||
echo "Installed version is older than ${TARGET_VERSION}."
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "Installed version is the same or newer than ${TARGET_VERSION}."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
PKG_ID="com.scriptingosx.Installomator"
|
|
||||||
TARGET_VERSION="9.1"
|
|
||||||
URLDOWNLOAD="%MosyleCDNFile:blah-blah-blah%"
|
|
||||||
######################################################################
|
|
||||||
# Installation using Installomator (enter the software to install separated with spaces in the "whatList"-variable)
|
|
||||||
whatList="handbrake theunarchiver microsoftoffice365"
|
|
||||||
# Covered by Mosyle Catalog: "brave firefox googlechrome microsoftedge microsoftteams signal sublimetext vlc webex zoom" among others
|
|
||||||
LOGO="mosyleb" # or "mosylem"
|
|
||||||
######################################################################
|
|
||||||
|
|
||||||
## Mark: Code here
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Mark: Condition for Installomator installation
|
|
||||||
|
|
||||||
INSTALLED_VERSION="$(pkgutil --pkg-info $PKG_ID 2>/dev/null | grep -i "^version" | awk '{print $2}')"
|
|
||||||
|
|
||||||
echo "Current Version: ${INSTALLED_VERSION}"
|
|
||||||
|
|
||||||
if [[ "$TARGET_VERSION" != "$INSTALLED_VERSION" ]]; then
|
|
||||||
TMPDIR=$(mktemp -d )
|
|
||||||
if ! cd "$TMPDIR"; then
|
|
||||||
echo "error changing directory $TMPDIR"
|
|
||||||
caffexit 98
|
|
||||||
fi
|
|
||||||
NAME=$TMPDIR/$(date +%s).pkg
|
|
||||||
if ! curl -fsL "$URLDOWNLOAD" -o "$NAME"; then
|
|
||||||
echo "error downloading $URLDOWNLOAD to $NAME."
|
|
||||||
caffexit 97
|
|
||||||
fi
|
|
||||||
installer -pkg "$NAME" -target /
|
|
||||||
rm -rf "$TMPDIR"
|
|
||||||
else
|
|
||||||
echo "Installomator version $INSTALLED_VERSION already installed!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Mark: Start Installomator label(s) installation
|
|
||||||
|
|
||||||
# Count errors
|
|
||||||
errorCount=0
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
caffexit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
for what in $whatList; do
|
|
||||||
#echo $item
|
|
||||||
# Install software using Installomator
|
|
||||||
cmdOutput="$(${destFile} ${what} LOGO=$LOGO NOTIFY=all BLOCKING_PROCESS_ACTION=tell_user || true)" # NOTIFY=silent BLOCKING_PROCESS_ACTION=quit_kill INSTALL=force
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -ne 0 ]] ; then
|
|
||||||
echo "Error installing ${what}. Exit code ${exitStatus}"
|
|
||||||
#echo "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
let errorCount++
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Errors: $errorCount"
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
|
|
||||||
caffexit $errorCount
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# Software
|
|
||||||
|
|
||||||
# Installation using Installomator
|
|
||||||
# Example of installing software using valuesfromarguments to install a custom software
|
|
||||||
|
|
||||||
LOGO="appstore" # or "addigy", "microsoft", "mosyleb", "mosylem"
|
|
||||||
###############################################
|
|
||||||
|
|
||||||
# Verify that Installomator has been installed
|
|
||||||
destFile="/usr/local/Installomator/Installomator.sh"
|
|
||||||
if [ ! -e "${destFile}" ]; then
|
|
||||||
echo "Installomator not found here:"
|
|
||||||
echo "${destFile}"
|
|
||||||
echo "Exiting."
|
|
||||||
exit 99
|
|
||||||
fi
|
|
||||||
|
|
||||||
# No sleeping
|
|
||||||
/usr/bin/caffeinate -d -i -m -u &
|
|
||||||
caffeinatepid=$!
|
|
||||||
caffexit () {
|
|
||||||
kill "$caffeinatepid"
|
|
||||||
pkill caffeinate
|
|
||||||
exit $1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Variables to calculate
|
|
||||||
downloadURL="https://craft-assets.invisionapp.com/CraftManager/production/CraftManager.zip"
|
|
||||||
appNewVersion=$(curl -fs https://craft-assets.invisionapp.com/CraftManager/production/appcast.xml | xpath -e '//rss/channel/item[1]/enclosure/@sparkle:shortVersionString' 2>/dev/null | cut -d '"' -f2)
|
|
||||||
|
|
||||||
# Install software using Installomator
|
|
||||||
cmdOutput="$(${destFile} valuesfromarguments LOGO=$LOGO \
|
|
||||||
name=CraftManager \
|
|
||||||
type=zip \
|
|
||||||
downloadURL=$downloadURL \
|
|
||||||
appNewVersion=$appNewVersion \
|
|
||||||
expectedTeamID=VRXQSNCL5W \
|
|
||||||
BLOCKING_PROCESS_ACTION=prompt_user \
|
|
||||||
LOGGING=REQ \
|
|
||||||
NOTIFY=all || true)"
|
|
||||||
|
|
||||||
# Check result
|
|
||||||
exitStatus="$( echo "${cmdOutput}" | grep --binary-files=text -i "exit" | tail -1 | sed -E 's/.*exit code ([0-9]).*/\1/g' || true )"
|
|
||||||
if [[ ${exitStatus} -eq 0 ]] ; then
|
|
||||||
echo -e "${what} succesfully installed.\n"
|
|
||||||
else
|
|
||||||
echo -e "Error installing ${what}. Exit code ${exitStatus}\n"
|
|
||||||
#printlog "$cmdOutput"
|
|
||||||
errorOutput="$( echo "${cmdOutput}" | grep --binary-files=text -i "error" || true )"
|
|
||||||
echo "$errorOutput"
|
|
||||||
caffexit $exitStatus
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "[$(DATE)][LOG-END]"
|
|
||||||
caffexit 0
|
|
||||||
Reference in New Issue
Block a user