#!/bin/bash ########################################################################## # Shellscript : Notification. # Autor : Andreas Vogel, macenterprise gmbh, 2020 ########################################################################## ###################################################################################################################################################### #Variablen # # # BundleID="${1}" -> Wird aus dem System übergeben. # DeferralType="${2}" -> Wird aus dem System übergeben. # DeferralValue="${3}" -> Wird aus dem System übergeben. # DeferralPlist="${4}" -> INGDiBa muss bestehen Bleiben! Darf nicht freibleiben!!!! -> Pflicht # AppName="${5}" -> Name der App -> Pflicht # App_ID="${6}" -> # ProcessName="${7}" # App_Icon="${8}" -> Welcher Icon angezeigt wird. # RunPolicy="${9}" # DeferralPlist="${10}" -> Gibt an, wie oft das Update verschoben werden kann -> Optional # AppQuitRequired="${11}" -> Gibt an, wie lange die Nachricht angezeigt wird -> Optional ###################################################################################################################################################### # Die Notification kann im beliebigen Intervall ausgeführt werden. # Die Möglichkeit, wie oft die Meldung verschoben werden kann, bis das Update erzwungen wird, kann dynamisch angepasst werden. # Ist keine Anpassung erfolgt, so wird die Möglichkeit auf 3 beschränkt. # Nach maximal möglichen Verschiebungen, wird das Update erzwungen und. Der User wird drauf hingewiesen. # Die Dauer der Meldung, kann in Sekunden bestimmt werden. ist nicht bestimmt worden, so wird der Standard auf 900 sec. gesetzt. # Der Text ist immer gleich. Über die Variable muss der Name der App angegeben werden. # Es muss festgelegt werden, ob ein Neustart erforderlich ist oder nicht. ################################ Alerter Version########################## macOS_Version=$(sw_vers -productVersion) if [[ "$macOS_Version" == *"10.15"* ]] then alerter_verion=/Library/Application\ Support/JAMF/alerter else alerter_verion=/Library/Application\ Support/JAMF/alerter\ 2 fi echo $alerter_verion ###################################################################################################################################################### fGetCurrenUser (){ currentUser=`python -c 'from SystemConfiguration import SCDynamicStoreCopyConsoleUser; import sys; username = (SCDynamicStoreCopyConsoleUser(None, None, None) or [None])[0]; username = [username,""][username in [u"loginwindow", None, u""]]; sys.stdout.write(username + "\n");'` # Identify the UID of the logged-in user currentUserUID=`id -u "$currentUser"` } user=$(stat -f '%u %Su' /dev/console | cut -d ' ' -f 2) ###################################################################################################################################################### 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 "Falscher Stundungstyp verwendet" exit 14 fi } ###################################################################################################################################################### App_ID="${6}" AppName="${5}" DeferralPlist="/Library/Application Support/JAMF/ING/de.ing.$App_ID.plist" BundleID="de.ing.$App_ID" DeferralType="count" App_Icon="${8}" ###################################################################################################################################################### # Setzen der Tage bzw. die Anzahl der Versuche, die das Update verschieben können. DeferralValue="${10}" # Wenn nicht in $10 gesetzt ist, wird hier der Standard gesetzt. Dieser kann den in $10 geändert werden. if [[ -z "$DeferralValue" ]] then DeferralValue=3 fi ###################################################################################################################################################### # Liest den Wert aus der Plist aus. Dieser wird dann in der StandardUpdatePrompt Ausgabe mit angegeben. CurrentDeferralValue="$(/usr/libexec/PlistBuddy -c "print :$BundleID:count" "$DeferralPlist" 2>/dev/null)" # Richten Sie den Verzögerungswert ein, falls er noch nicht vorhanden ist 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 ###################################################################################################################################################### # Gibt die Zeit in Sekunden, wie lange das Fenster bleiden soll #TimeOutinSec="${Parameter}" ## Falls kein Wert ind $Parameter gesetzt worden ist, wird dieser hier bestimmt und als Standard genutzt. #if [[ -z "$TimeOutinSec" ]] # then # TimeOutinSec="900" #fi TimeOutinSec="870" ###################################################################################################################################################### # Muss die App vor dem Update beendet werden? ###################################################################################################################################################### AppQuitRequired="${11}" ProcessName="${7}" GracefullykillApp () { osascript </dev/null quit app "$ProcessName" EOF } tell () { while [ ! -z "$(pgrep -i "$ProcessName")" ] do GracefullykillApp if [[ -z "$(pgrep -i "$ProcessName")" ]]; then break fi done } if [ "$AppQuitRequired" == "ja" ] then QuitApp=tell fi ###################################################################################################################################################### # Standard Update Message StandardUpdatePrompt="Für $AppName ist ein Update verfügbar. " # Erzwungene Aktualisierungsnachricht ForcedUpdatePrompt="Das Update für $AppName wird nun durchgeführt. " ## Functions ## RunPolicy="${9}" updateGUI (){ rm -rf "$DeferralPlist" $QuitApp jamf policy -id $RunPolicy } # Jemand ist angemeldet. Aufforderung, falls Updates NUR dann neu gestartet werden müssen, wenn der Update-Timer nicht Null erreicht hat if [[ "$CurrentDeferralValue" -gt 0 ]]; then fGetCurrenUser # Reduzieren Sie den Timer um 1. Das Skript wird am nächsten Tag erneut ausgeführt let CurrTimer=$CurrentDeferralValue-1 setDeferral "$BundleID" "$DeferralType" "$CurrTimer" "$DeferralPlist" Alerter="$(/bin/launchctl asuser "$currentUserUID" "$alerter_verion" -appIcon "$App_Icon" -title "Client Service Mac" -message "$StandardUpdatePrompt" -closeLabel "Aktualisieren" -actions "Verschieben ($CurrentDeferralValue)","Im Self Service anzeigen" -dropdownLabel "Mehr Optionen" -timeout $TimeOutinSec)" echo "Alerter Exit Code: $Alerter" # Wenn sie auf "Aktualisieren" klicken, werden sie zum Einstellungsbereich für Software-Updates weitergeleitet if [ "$Alerter" == "Aktualisieren" ]; then updateGUI elif [ "$Alerter" == "Im Self Service anzeigen" ] || [[ "$Alerter" == "@CONTENTCLICKED" ]]; then /bin/launchctl asuser "$currentUserUID" sudo -u "$user" /usr/bin/open "jamfselfservice://content?entity=policy&id=$RunPolicy&action=view" fi exit 0 else fGetCurrenUser Alerter="$(/bin/launchctl asuser "$currentUserUID" "$alerter_verion" -appIcon "$App_Icon" -title "Client Service Mac" -message "$ForcedUpdatePrompt" -actions "Jetzt Aktualisieren" -closeLabel "Kein Verschieben mehr" -timeout $TimeOutinSec)" echo "Alerter Exit Code: $Alerter" # Wenn sie auf Updates installieren klicken, führen Sie die Updates aus # Der Timer ist bereits 0, die Updates werden automatisch ausgeführt, der Endbenutzer wurde gewarnt! if [ "$Alerter" == "Jetzt Aktualisieren" ] || [[ "$Alerter" == "@TIMEOUT" ]] || [[ "$Alerter" == "Kein Verschieben mehr" ]] || [[ "$Alerter" == "@CONTENTCLICKED" ]]; then updateGUI fi fi exit 0