#!/bin/bash ##################################################################################### # Shellscript : User kann entscheiden, wann das Gerät neugestartet wird. # Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019 ##################################################################################### #################################### Jamf Helper #################################### jamfHelper="/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper" jamf="/usr/local/bin/jamf" 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" Message=" Auf diesem Gerät wurde ein Sicherheitsupdate installiert. Dieses erfordert einen Neurtart des Gerätes. Bitte starte den Rechner jetzt neu oder wähle eine der Optionen aus um den Neustart zu verschieben. A security update has been installed on this device. This requires a reboot of the device. Please restart the computer now or select one of the options to reschedule the restart. " RestartOptions=$("$jamfHelper" -windowType utility -icon "$INGIcon" -title "Please restart" -description "$Message" -button2 "Restart in" -showDelayOptions "300, 900, 1800, 14400, 21600" -button1 "Immediately" -cancelButton 1 -defaultButton 2 -timeout "300" -countdown -alignCountdown "right") #################################### Variablen Zeit ermitteln #################################### # Variablen zur weiterverarbeitung # Diese Variablen werden benötigt, damit ausgewertet werden kann, welche Taste gedrückt worden ist. # Des Weiteren wird die gewählte Zeit ausgewertet und nach welche Zeit die letzte Warnung in Sekunden # erfolgen wird. buttonClicked="${RestartOptions:$i-1}" result=$RestartOptions delayint=$(echo "$result" | /usr/bin/sed 's/.$//') warndelayint=$(expr $delayint - 60) warndelayfivemin=$(expr $delayint - 300) # Variablen delayRestart # Diese Variablen werden für den delayRestart Daemon benutzt. # Die Variablen sind entsprechen nicht den Variablen für die letzte Meldung. defercal=$(($(/bin/date +%s) + delayint)) hour=$(/bin/date -j -f "%s" "$defercal" "+%H") minute=$(/bin/date -j -f "%s" "$defercal" "+%M") Day=$(/bin/date -j -f "%s" "$defercal" +"%d.%m.%y") # Variablen für LastWarning Daemon # Dieses Variablen werden für den Daemon benutz, der eine Minute vor dem geplanten Neustart # gestartet wird und die Meldung bringt. warndefercal=$(($(/bin/date +%s) + warndelayint)) warnhour=$(/bin/date -j -f "%s" "$warndefercal" "+%H") warnminute=$(/bin/date -j -f "%s" "$warndefercal" "+%M") # Variablen für 5minWarning Daemon # Dieses Variablen werden für den Daemon benutz, der 5 Minute vor dem geplanten Neustart # gestartet wird und die Meldung bringt. warner=$(($(/bin/date +%s) + warndelayfivemin)) behour=$(/bin/date -j -f "%s" "$warner" "+%H") beminute=$(/bin/date -j -f "%s" "$warner" "+%M") #################################### Variablen Massage / Icons #################################### InfoIcon="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/ToolbarInfo.icns" RestartIcon="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Sync.icns" RestartMessage="Das System wird in 1 Minute neugestartet. Es erfolgt kein weiterer Hinweis. The system will restart in 1 minute. There is no further notice." InfoMessage="Das System wird aufgrund deiner Auswahl am $Day um $hour:$minute Uhr neu gestartet. The system will restart at $Day $hour:$minute o'clock based on your selection " ShutdownMessage="Das System wird jetzt aufgrund deiner Auswahl neu gestartet. Das System wird für den Neustart vorbereitet. The system will restart now based on your selection. The system is being prepared for a restart. " FiveMinShutdownMessage="Das System wird aufgrund deiner Auswahl in 5 Minuten neu gestartet. The system will restart in 5 minutes based on your selection. " #################################### Create deamen #################################### # Daemon wird erstellt, wenn der User eine Längere Zeit als 15 min für den neustart auswählt. # Diese Daemon wird 5 min vor dem geplanten neustart gestartet und ausgeführt. # Der Daemon führt nur ein Script aus, der eine Meldung für den Neustart gibt. FiveMinWarningDaemon() { /bin/cat < /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist Label de.ing.FiveMinWarningScript ProgramArguments /bin/bash /Library/Application Support/JAMF/ING/de.ing.FiveMinWarningScript.sh StartCalendarInterval Hour $behour Minute $beminute EOA } # Daemon wird immer erstellt. # Diese Daemon wird 1 min vor dem geplanten neustart gestartet und ausgeführt. # Der Daemon führt das Script "LastWarningScript" aus. LastWarningDaemon() { /bin/cat < /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist Label de.ing.LastWarningDaemon ProgramArguments /bin/bash /Library/Application Support/JAMF/ING/de.ing.LastWarningScript.sh StartCalendarInterval Hour $warnhour Minute $warnminute EOB } # Daemon wird immer erstellt. # Diese Daemon dient lediglich als Backup, falls der User sein Gerät vor dem geplanten und dem durch den # Daemon "LastWarningDaemon" verursachten Neustart durchführt. # Der Daemon führt das Script "LastWarningScript" aus. EnforceRestatDaemon() { /bin/cat < /Library/LaunchDaemons/de.ing.EnforceRestat.plist Label de.ing.EnforceRestatDaemon ProgramArguments /bin/bash /Library/Application Support/JAMF/ING/de.ing.EnforceRestatScript.sh RunAtLoad StartInterval 600 EOC } #################################### Create Script #################################### FiveMinWarningScript() { /bin/cat < /Library/Application\ Support/JAMF/ING/de.ing.FiveMinWarningScript.sh #!/bin/bash ##################################################################################### # Shellscript : User bekommt eine Meldung, dass ein Neustart bevorsteht. # Es handelt sich jedoch nicht um die letzte Meldung. # Eine weitere Meldung wird noch erfolgen. # Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019 ##################################################################################### ################################# Ausführung des Scripts ################################# /Library/Application\ Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType utility -icon "$InfoIcon" -title "Restart in five minutes" -description "$FiveMinShutdownMessage" -button1 "OK" -defaultButton 1 -timeout 60 EOD } # Sicherstellung, dass der Neustart eine Minute nach der Meldung erfolgt. # Bassierend auf der Auswahlt, die der User getroffen hat. # Neustart wird nicht verzögert. Unaghängig ob der User in der letzten Meldung auf OK klickt oder nicht wird der Neustart # zu der geplanten Zeit ausgeführt. # Gemäß der der "man shutdown" kann die Option wie folgt gelegt werden: # -r The system is rebooted at the specified time. # The hours and minutes in the second time format may be separated by a colon (``:'') for backward compatibility. # Anschliessend wird das Script den Daemon wieder löschen. Das Script bleibt erhalten. # Beim nächsten ausführen der Policy wird das Script überschrieben und die neuen Variablen übernehmen. LastWarningScript() { /bin/cat < /Library/Application\ Support/JAMF/ING/de.ing.LastWarningScript.sh #!/bin/bash ##################################################################################### # Shellscript : Letzte Meldung vor dem Neustart. Setz den Neustart fest. # Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019 ##################################################################################### ################################# Ausführung des Scripts ################################# # Neustart wird gesetzt shutdown -r $hour:$minute # User wird informiert, dass der Neustart anliegt. /Library/Application\ Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType utility -icon "$InfoIcon" -title "Warning" -description "$RestartMessage" -button1 "OK" -defaultButton 1 -timeout 45 EOE } EnforceRestatScript() { read -d '' EnforceRestat<<"EOF" #!/bin/bash ##################################################################################### # Shellscript : Script stellt sicher, dass das Gerät neugestartet worden ist. # Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019 ##################################################################################### #################################### source #################################### source "/Library/Application\ Support/JAMF/ING/de.ing.ProcessingResources.sh" # Prüfung der source echo $LatestTimeOfRestart echo $DayOfRestart echo $TimeOfRestart #################################### Time Today #################################### today=$(date +%s) echo "Heute ist der $today" #################################### Daemond ans Script #################################### listDaemons=" /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist " listScripts=" LastWarningScript.sh FiveMinWarningScript.sh " removeDaemon(){ for d in $listDaemons do if [ -f "$d" ] then echo $d sudo launchctl unload $d sudo rm $d fi done } removeScript(){ for s in $listScripts do if [ -f "/Library/Application Support/JAMF/ING/$s" ] then echo $s rm -rf "/Library/Application Support/JAMF/ING/$s" fi done } #################################### Jamf Helper #################################### jamfHelper="/Library/Application Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper" jamf="/usr/local/bin/jamf" user=$(stat -f '%u %Su' /dev/console | cut -d ' ' -f 2) Icon="/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/AlertNoteIcon.icns" EnforceMessage=" Der geplante Neustart für dem $DayOfRestart um $TimeOfRestart konnte nicht durchgeführt werden. Möglicherweise befand sich das Gerät im Ruhemodus. Der Neustart wird nun durchgeführt. " ################################# Find last Reboot ################################# # Zeit umwandeln # wird benötigt um die Zeit in ein Gewünschtes Format umzuwandeln # Es kann umgewandelt werden in Uhrzeit oder Datum # lastBootFormatMin=$(date -jf "%s" "$lastBootRaw" +"%H:%M:%S") # lastBootFormatDay=$(date -jf "%s" "$lastBootRaw" +"%d.%m:%y") # echo "Umgewandelte Zeit ist $lastBootFormatDay $lastBootFormatMin" ########################## wann wurde der Neustart durchgeführt ########################## # Auslesen, wann der Neustart durchgeführt worden ist lastBootRaw=$(sysctl kern.boottime | awk '{print $5}' | tr -d ,) lastBootFormatMin=$(date -jf "%s" "$lastBootRaw" +"%H:%M:%S") echo $lastBootFormatMin echo "Der Neustart wurde durchgeführt am $lastBootRaw" ########################## wann wurde die Datei erstellt ########################## # Auslesen, wann die Datei erstellt worden ist TimeCreate=$(date -r /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist +'%s') TimeCreateFormatMin=$(date -jf "%s" "$TimeCreate" +"%H:%M:%S") echo $TimeCreateFormatMin echo "Die Datei wurde erstellt am $TimeCreate" ########################## Enforce Warning ########################## EnforceWarning() { shutdown -r +1 "$jamfHelper" -windowType utility -icon "$Icon" -title "Warning" -description "$EnforceMessage" -button1 "OK" -defaultButton 1 -timeout 45 } ########################## Ausführung ########################## if [ $lastBootRaw -gt $TimeCreate ] then echo "User hat bereits selbst neugestartet" removeDaemon removeScrpit rm -rf /Library/LaunchDaemons/de.ing.EnforceRestat.plist else if [ $today -gt $LatestTimeOfRestart ] then echo "Neustart ist überfällig und hätte bereits erfolgen müssen" EnforceWarning removeDaemon removeScrpit rm -rf /Library/LaunchDaemons/de.ing.EnforceRestat.plist else echo "Neustart noch nicht erforderlich" fi fi EOF } ProcessingResources() { /bin/cat < /Library/Application\ Support/JAMF/ING/de.ing.ProcessingResources.sh #!/bin/bash ##################################################################################### # Shellscript : Stellt die Variablen für das EnforceRestart Script bereit. # Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019 ##################################################################################### ################################# Variablen für EnforceRestart Script ################################# LatestTimeOfRestart=$defercal DayOfRestart=$Day TimeOfRestart=$hour:$minute EOG } shutdownWarning() { shutdown -r +1 /Library/Application\ Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType utility -icon "$InfoIcon" -title "Warning" -description "$ShutdownMessage" -button1 "OK" -defaultButton 1 -timeout 45 } UserInfo() { "$jamfHelper" -windowType utility -icon "$InfoIcon" -title "Restart Info" -description "$InfoMessage" -button1 "OK" -defaultButton 1 -timeout 45 } #################################### Load Daemon and Script #################################### StartandLoadFiveMin() { # set ownership on LastWarningDaemon launch daemon /usr/sbin/chown root:wheel /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist /bin/chmod 644 /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist #load launchd launchctl load /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist #set ownership for Script /usr/sbin/chown root:admin "/Library/Application Support/JAMF/ING/de.ing.FiveMinWarningScript.sh" /bin/chmod 755 "/Library/Application Support/JAMF/ING/de.ing.FiveMinWarningScript.sh" } StartandLoadLast() { # set ownership on LastWarningDaemon launch daemon /usr/sbin/chown root:wheel /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist /bin/chmod 644 /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist #load launchd launchctl load /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist #set ownership for Script /usr/sbin/chown root:admin "/Library/Application Support/JAMF/ING/de.ing.LastWarningScript.sh" /bin/chmod 755 "/Library/Application Support/JAMF/ING/de.ing.LastWarningScript.sh" } StartandLoadEnforce() { echo "$EnforceRestat" > /Library/Application\ Support/JAMF/ING/de.ing.EnforceRestatScript.sh # set ownership on LastWarningDaemon launch daemon /usr/sbin/chown root:wheel /Library/LaunchDaemons/de.ing.EnforceRestat.plist /bin/chmod 644 /Library/LaunchDaemons/de.ing.EnforceRestat.plist #load launchd launchctl load /Library/LaunchDaemons/de.ing.EnforceRestat.plist #set ownership for Script /usr/sbin/chown root:admin "/Library/Application Support/JAMF/ING/de.ing.EnforceRestatScript.sh" /bin/chmod 755 "/Library/Application Support/JAMF/ING/de.ing.EnforceRestatScript.sh" } StartProcessingResources() { #set ownership for Script /usr/sbin/chown root:admin "/Library/Application Support/JAMF/ING/de.ing.ProcessingResources.sh" /bin/chmod 755 "/Library/Application Support/JAMF/ING/de.ing.ProcessingResources.sh" } #################################### Ausführung #################################### if [[ "$buttonClicked" == "2" ]] && [[ ! -z "$delayint" ]] && [[ $delayint -gt 900 ]] then echo "option 1 länger als 15 min. 5 min vor dem Start eine Meldung und eine min " ProcessingResources StartProcessingResources FiveMinWarningDaemon FiveMinWarningScript LastWarningDaemon LastWarningScript EnforceRestatDaemon EnforceRestatScript StartandLoadFiveMin StartandLoadLast StartandLoadEnforce UserInfo else if [[ "$buttonClicked" == "2" ]] && [[ ! -z "$delayint" ]] then echo "option 2 unter 15 Min. Warnung nur 1 min vor dem Neustart" ProcessingResources StartProcessingResources LastWarningDaemon LastWarningScript EnforceRestatDaemon EnforceRestatScript StartandLoadLast StartandLoadEnforce UserInfo elif [ "$buttonClicked" == "1" ] then shutdownWarning fi fi