Files
Alte_Skripte/aktuelle_Scripte/restart_mit_daemon _erweitert.sh
2026-02-16 15:05:15 +01:00

437 lines
15 KiB
Bash

#!/bin/bash
#####################################################################################
# Shellscript : User kann entscheiden, wann das Gerät neugestartet wird.
# Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019
#####################################################################################
#################################### Remove und Delete old Daemon ####################################
launchctl remove de.ing.LastWarningDaemon.plist
/bin/rm -f /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist
#################################### 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 "120, 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 um $hour:$minute Uhr neu gestartet.
The system will restart at $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 <<EOF > /Library/LaunchDaemons/de.ing.FiveMinWarningDaemon.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.ing.FiveMinWarningScript</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/JAMF/ING/de.ing.FiveMinWarningScript.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>$behour</integer>
<key>Minute</key>
<integer>$beminute</integer>
</dict>
</dict>
</plist>
EOF
}
# 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 <<EOF > /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.ing.LastWarningDaemon</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/JAMF/ING/de.ing.LastWarningScript.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>$warnhour</integer>
<key>Minute</key>
<integer>$warnminute</integer>
</dict>
</dict>
</plist>
EOF
}
# 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 <<EOF > /Library/LaunchDaemons/de.ing.EnforceRestat.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>de.ing.EnforceRestatDaemon</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Library/Application Support/JAMF/ING/de.ing.EnforceRestatScript.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>600</integer>
</dict>
</plist>
EOF
}
#################################### Create Script ####################################
FiveMinWarningScript()
{
/bin/cat <<EOF > /Library/Application\ Support/JAMF/ING/de.ing.FiveMinWarningScript.sh
#!/bin/bash
/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
launchctl remove de.ing.FiveMinWarningScript.plist
/bin/rm -f /Library/LaunchDaemons/de.ing.FiveMinWarningScript.plist
EOF
}
# 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 <<EOF > /Library/Application\ Support/JAMF/ING/de.ing.LastWarningScript.sh
#!/bin/bash
shutdown -r $hour:$minute
/Library/Application\ Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType utility -icon "$InfoIcon" -title "Warning" -description "$RestartMessage" -button1 "OK" -defaultButton 1 -timeout 45
launchctl remove de.ing.LastWarningDaemon.plist
/bin/rm -f /Library/LaunchDaemons/de.ing.LastWarningDaemon.plist
launchctl remove de.ing.EnforceRestat.plist
/bin/rm -f /Library/LaunchDaemons/de.ing.EnforceRestat.plist
EOF
}
EnforceRestatScript()
{
/bin/cat <<EOF > /Library/Application\ Support/JAMF/ING/de.ing.EnforceRestatScript.sh
#!/bin/bash
#####################################################################################
# Shellscript : Script stellt sicher, dass das Gerät neugestartet worden ist.
# Autor : Andreas Vogel, macenterprise gmbh, 17.12.2019
#####################################################################################
#################################### 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
"
################################# Unload or Remove #################################
removeDaemon(){
for d in $listDaemons
do
if [ -f "$d" ]
then
echo $d
sudo launchctl unload $d
sudo rm $d
fi
done
}
removeScrpit(){
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)
INGIcon="/Users/$user/Library/Application Support/com.jamfsoftware.selfservice.mac/Documents/Images/brandingimage.png"
EnforceMessage="
Der geplante Neustart für dem $Day um $hour:$minute 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 ,)
echo "Der Neustart wurde durchgeführt am $lastBootRaw"
########################## wann wurde die Datei erstellt ##########################
# Auslesen, wann die Datei erstellt worden ist
TimeCreate=$(date -r /Users/andreasvogel/Desktop/test +'%s')
echo "Die Datei wurde erstellt am $TimeCreate"
delayint=$(echo "$result" | /usr/bin/sed 's/.$//')
defercal=$(($(/bin/date +%s) + delayint))
########################## Enforce Warning ##########################
EnforceWarning()
{
# shutdown -r +1
/Library/Application\ Support/JAMF/bin/jamfHelper.app/Contents/MacOS/jamfHelper -windowType utility -icon "$InfoIcon" -title "Warning" -description "$EnforceMessage" -button1 "OK" -defaultButton 1 -timeout 45
}
########################## Ausführung ##########################
if [ $lastBootRaw -lt $TimeCreate ]
then
if [ $today -lt $defercal ]
then
# shutdown -r +2
# EnforceWarning
# removeDaemon
# removeScrpit
# rm -rf /Library/LaunchDaemons/de.ing.EnforceRestat.plist
echo "vor"
else
# removeDaemon
# removeScrpit
# rm -rf /Library/LaunchDaemons/de.ing.EnforceRestat.plist
echo "nach"
fi
fi
EOF
}
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
}
#################################### 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()
{
# 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"
}
#################################### 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 "
FiveMinWarningDaemon
FiveMinWarningScript
LastWarningDaemon
LastWarningScript
EnforceRestatDaemon
EnforceRestatScript
StartandLoadFiveMin
StartandLoadLast
StartandLoadEnforce
else
if [[ "$buttonClicked" == "2" ]] && [[ ! -z "$delayint" ]]
then
echo "option 2 unter 15 Min. Warnung nur 1 min vor dem Neustart"
LastWarningDaemon
LastWarningScript
EnforceRestatDaemon
EnforceRestatScript
StartandLoadLast
StartandLoadEnforce
elif [ "$buttonClicked" == "1" ]
then
shutdownWarning
fi
fi