Files
2026-02-16 15:05:15 +01:00

202 lines
9.1 KiB
Bash

#!/bin/bash
##########################################################################
# Shellscript : Notification.
# Autor : Andreas Vogel, macenterprise gmbh, 2019
##########################################################################
######################################################################################################################################################
#Variablen
#
#
# BundleID="${1}" -> Wird aus dem System übergeben.
# DeferralType="${2}" -> Wird aus dem System übergeben.
# DeferralValue="${3}" -> Wird aus dem System übergeben.
# AppName="${4}" -> Gibt an, welche Application betroffen ist. -> Pflicht
# AppQuitRequired="${5}" -> Gibt an, ob die App vor dem Update geschlossen werden muss -> Pflicht
# ProcessName="${6}" -> Hier muss der exakte Name des Prozesses angegeben werden -> Pflicht
# RebootRequired="${7}" -> Gibt an, ob ein Neustart erforderlich ist ja / nein -> Pflicht
# RunPolicy="${8}" -> Gibt an, welche Policy ausgeführt werden soll. Diese wird über die Policy-ID ausgeführt -> Pflicht
# Frei Variable="${9}" -> Diese Variable ist frei
# DeferralPlist="${10}" -> Gibt an, wie oft das Update verschoben werden kann -> Optional
# TimeOutinSec="${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.
# 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 "Falscher Stundungstyp verwendet"
exit 14
fi
}
######################################################################################################################################################
AppName="${4}"
DeferralPlist="/Library/Application Support/JAMF/ING/com.custom.$AppName.plist"
BundleID="de.ing.$AppName"
DeferralType="count"
######################################################################################################################################################
# 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 $4 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
jamfHelper="/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper"
jamf="/usr/local/bin/jamf"
######################################################################################################################################################
# Gibt die Zeit in Sekunden, wie lange das Fenster bleiden soll
TimeOutinSec="${11}"
# Falls kein Wert ind $5 gesetzt worden ist, wird dieser hier bestimmt und als Standard genutzt.
if [[ -z "$DeferralValue" ]]; then
TimeOutinSec="900"
fi
######################################################################################################################################################
# Neistart erforderlich?
######################################################################################################################################################
RebootRequired="${7}"
if [ "$RebootRequired" == "ja" ]; then
RebootMessage="Nach den Update wird der Rechner neu gestartet."
Reboot="shutdown -r now"
fi
######################################################################################################################################################
# Muss die App vor dem Update beendet werden?
######################################################################################################################################################
AppQuitRequired="${5}"
ProcessName="${6}"
tell () {
killall "$ProcessName"
}
if [ "$AppQuitRequired" == "ja" ]; then
QuitApp=tell
fi
######################################################################################################################################################
AppName="${4}"
# Standard Update Message
StandardUpdatePrompt="Für $AppName ist ein Update verfügbar.
Klicken Sie auf Fortsetzen, um mit der Installation zu beginnen.
Wenn Sie den Vorgang zu diesem Zeitpunkt nicht starten können,
können Sie den Vorgang um einen Tag verschieben.
Tage bis zur erzwungenen Installation: $CurrentDeferralValue Tage
Sie können jederzeit die Installation über den ING Germany Self Service durchführen.
Nach Ablauf der Frist wird ein Update aus Sicherheitsgründen erzwungen !
$RebootMessage
"
# Erzwungene Aktualisierungsnachricht
ForcedUpdatePrompt="Für Ihren Rechner ist ein $AppName Update notwendig.
Sie haben die Aktualisierung bereits so oft wie möglich verschoben.
Bitte speichern Sie Ihre Arbeit jetzt und klicken Sie auf Aktualisieren.
Das Update wird ansonsten automatisch durchgeführt.
$RebootMessage
"
# INGIcon
user=$(stat -f '%u %Su' /dev/console | cut -d ' ' -f 2)
INGIcon="/Users/$user/Library/Application Support/com.jamfsoftware.selfservice.mac/Documents/Images/brandingimage.png"
## Functions ##
RunPolicy="${8}"
updateGUI (){
rm -rf "$DeferralPlist"
$QuitApp
jamf policy -id $RunPolicy
$Reboot
}
# 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
# 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"
HELPER=$("$jamfHelper" -windowType utility -icon "$INGIcon" -title "ING Germany Notification" -description "$StandardUpdatePrompt" -button1 "Fortsetzen" -button2 "Verschieben" -cancelButton "2" -defaultButton 2 -timeout "$TimeOutinSec")
echo "Jamf Helper Exit Code: $HELPER"
# Wenn sie auf "Aktualisieren" klicken, werden sie zum Einstellungsbereich für Software-Updates weitergeleitet
if [ "$HELPER" == "0" ]; then
updateGUI
fi
exit 0
else
HELPER=$("$jamfHelper" -windowType utility -icon "$INGIcon" -title "ING Germany Notification" -description "$ForcedUpdatePrompt" -button1 "Update" -defaultButton 1 -timeout "$TimeOutinSec" -countdown -alignCountdown "right")
echo "Jamf Helper Exit Code: $HELPER"
# Wenn sie auf Updates installieren klicken, führen Sie die Updates aus
# Offenbar hat jemand versucht, jamfHelper zu beenden, oder der jamfHelper-Bildschirm hat eine Zeitüberschreitung
# Der Timer ist bereits 0, die Updates werden automatisch ausgeführt, der Endbenutzer wurde gewarnt!
if [[ "$HELPER" == "0" ]] || [[ "$HELPER" == "239" ]]; then
updateGUI
fi
fi
exit 0