#!/bin/bash ########################################################################## # Shellscript : macOS Upgrade with deferral # Autor : Andreas Vogel, NEXT Enterprise gmbh, 2021 ########################################################################## # set -x setDeferral (){ BundleID="${1}" DeferralType="${2}" DeferralValue="${3}" DeferralPlist="${4}" if [[ "$DeferralType" == "date" ]]; then DeferralDate="$(/usr/libexec/PlistBuddy -c "print :$BundleID:date" "$DeferralPlist" 2>/dev/null)" # Set deferral date if [[ -n "$DeferralDate" ]] && [[ ! "$DeferralDate" =~ "File Doesn't Exist" ]]; then # /usr/libexec/PlistBuddy -c "set :$BundleID:date '07/04/2019 11:21:51 +0000'" "$DeferralPlist" /usr/libexec/PlistBuddy -c "set :$BundleID:date $DeferralValue" "$DeferralPlist" 2>/dev/null else # /usr/libexec/PlistBuddy -c "add :$BundleID:date date '07/04/2019 11:21:51 +0000'" "$DeferralPlist" /usr/libexec/PlistBuddy -c "add :$BundleID:date date $DeferralValue" "$DeferralPlist" 2>/dev/null fi elif [[ "$DeferralType" == "count" ]]; then DeferralCount="$(/usr/libexec/PlistBuddy -c "print :$BundleID:count" "$DeferralPlist" 2>/dev/null)" # Set deferral count if [[ -n "$DeferralCount" ]] && [[ ! "$DeferralCount" =~ "File Doesn't Exist" ]]; then /usr/libexec/PlistBuddy -c "set :$BundleID:count $DeferralValue" "$DeferralPlist" 2>/dev/null else /usr/libexec/PlistBuddy -c "add :$BundleID:count integer $DeferralValue" "$DeferralPlist" 2>/dev/null fi else echo "Incorrect deferral type used." exit 14 fi } jamfHelper="/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper" jamf="/usr/local/bin/jamf" OSMajorVersion="$(/usr/bin/sw_vers -productVersion | /usr/bin/cut -d '.' -f 1)" DeferralPlist="/Library/Application Support/JAMF/com.upgrade.deferrals.plist" BundleID="com.apple.SoftwareUpgrade" DeferralType="count" DeferralValue="${4}" if [[ -z "$DeferralValue" ]]; then DeferralValue=10 fi TimeOutinSec="${5}" if [[ -z "$TimeOutinSec" ]]; then TimeOutinSec="900" fi ITContact="${6}" if [[ -z "$ITContact" ]]; then ITContact="IT" fi CurrentDeferralValue="$(/usr/libexec/PlistBuddy -c "print :$BundleID:count" "$DeferralPlist" 2>/dev/null)" if [[ -z "$CurrentDeferralValue" ]] || [[ "$CurrentDeferralValue" =~ "File Doesn't Exist" ]]; then setDeferral "$BundleID" "$DeferralType" "$DeferralValue" "$DeferralPlist" CurrentDeferralValue="$(/usr/libexec/PlistBuddy -c "print :$BundleID:count" "$DeferralPlist" 2>/dev/null)" fi CurrentUser=$(/usr/sbin/scutil <<< "show State:/Users/ConsoleUser" | /usr/bin/awk -F': ' '/[[:space:]]+Name[[:space:]]:/ { if ( $2 != "loginwindow" ) { print $2 }}') Language=$(/usr/libexec/PlistBuddy -c 'print AppleLanguages:0' "/Users/${CurrentUser}/Library/Preferences/.GlobalPreferences.plist") if [[ $Language = de* ]]; then UserLanguage="de" else UserLanguage="en" fi realname=$(dscl . read /Users/$CurrentUser RealName | tail -n1) AppleSUIcon="/System/Library/CoreServices/Install Command Line Developer Tools.app/Contents/Resources/SoftwareUpdate.icns" ############################### Messages ########################################################### HeadingTest_en="New macOS available: Monterey" HeadingTest_de="Neues macOS verfügbar: Monterey" no_ac_power_en="The computer is currently running on battery power and is not connected to a power source. Connect the computer to a power source and try again." no_ac_power_de="Der Computer wird derzeit mit Akkustrom betrieben und ist nicht an eine Stromquelle angeschlossen. Schließen den Computer an eine Stromquelle an und versuchen es erneut." StandardUpdatePrompt_en="Hello, $realname for your Mac, an operating system upgrade to macOS Monterey is available. Click Upgrade to install the latest version of the operating system. If you can't start the upgrade at this time, you can postpone it for one day. When the number of deferrals is used up, the upgrade will be forced. The upgrade will take up to 60 minutes. Please make sure that your work is backed up. Remaining number of deferrals: $CurrentDeferralValue" StandardUpdatePrompt_de="Hallo, $realname für deinen Mac ist ein Betriebssystem-Upgrade auf macOS Monterey verfügbar. Klicken auf Upgrade, um die aktuelle Version des Betriebssystems zu installieren. Wenn du das Upgrade zu diesem Zeitpunkt nicht starten kannst, kannst du ihn um einen Tag verschieben. Wenn die Anzahl der Aufschübe aufgebraucht ist, wird die Aktualisierung erzwungen. Die Aktualisierung nimmt bis zu 60 Minuten in Anspruch. Bitte stelle sicher, dass deine Arbeit gesichert ist. Verbleibende Anzahl der Verschiebungen: $CurrentDeferralValue" ForcedUpdatePrompt_en="Hello, $realname for your Mac is available an operating system upgrade to macOS Monterey that require a reboot. You have already postponed the upgrade as many times as possible. Please save your work and click Upgrade. Remaining time until the upgrade will start automatically is displayed below." ForcedUpdatePrompt_de="Hallo, $realname für deinen Mac ist ein Betriebssystem-Upgrade auf macOS Monterey verfügbar, das einen Neustart erfordern. Du hast das Upgrade bereits so oft wie möglich verschoben. Bitte speichere deine Arbeit und klicken Sie auf Upgrade. Verbleibende Zeit, bis das Upgrade automatisch startet, wird Dir unten angezeigt." button1_en="Upgrade" button1_de="Upgrade" button2_en="delay" button2_de="Verschieben" HeadingTest=HeadingTest_${UserLanguage} no_ac_power=no_ac_power_${UserLanguage} StandardUpdatePrompt=StandardUpdatePrompt_${UserLanguage} ForcedUpdatePrompt=ForcedUpdatePrompt_${UserLanguage} button1=button1_${UserLanguage} button2=button2_${UserLanguage} alignDescription="justified" alignHeading="natural" ## Functions ## powerCheck (){ # This is meant to be used when doing CLI update installs. # Updates through the GUI can already determine its own requirements to proceed with # the update process. # Let's wait 5 minutes to see if computer gets plugged into power. for (( i = 1; i <= 5; ++i )); do if [[ "$(/usr/bin/pmset -g ps | /usr/bin/grep "Battery Power")" = "Now drawing from 'Battery Power'" ]]; then echo "${!no_ac_power}" /bin/sleep 60 else return 0 fi done exit 11 } LoggedInUser="$(/usr/sbin/scutil <<< "show State:/Users/ConsoleUser" | /usr/bin/awk '/Name :/ && ! /loginwindow/ { print $3 }')" if [[ "$LoggedInUser" == "" ]]; then powerCheck else if [[ "$CurrentDeferralValue" -gt 0 ]]; then # Reduce the timer by 1. The script will run again the next day let CurrTimer=$CurrentDeferralValue-1 setDeferral "$BundleID" "$DeferralType" "$CurrTimer" "$DeferralPlist" HELPER=$("$jamfHelper" -windowType utility -icon "$AppleSUIcon" -title "Apple macOS Upgrade" -heading "${!HeadingTest}" -description "${!StandardUpdatePrompt}" -alignDescription "$alignDescription" -button1 "${!button1}" -button2 "${!button2}" -cancelButton "2" -defaultButton 2 -timeout "$TimeOutinSec" -countdown -alignCountdown "right") echo "Jamf Helper Exit Code: $HELPER" # If they click "Update" then take them to the software update preference pane if [ "$HELPER" == "0" ]; then rm -rf "$DeferralPlist" jamf policy -event upgrade fi exit 0 else HELPER=$("$jamfHelper" -windowType utility -icon "$AppleSUIcon" -title "Apple macOS Upgrade" -heading "${!HeadingTest}" -alignHeading "$alignHeading" -description "${!ForcedUpdatePrompt}" -alignDescription "$alignDescription" -button1 "${!button1}" -defaultButton 1 -timeout "$TimeOutinSec" -countdown -alignCountdown "right") echo "Jamf Helper Exit Code: $HELPER" if [[ "$HELPER" == "0" ]] || [[ "$HELPER" == "239" ]]; then rm -rf "$DeferralPlist" jamf policy -event upgrade fi fi fi exit 0