Last active
August 23, 2017 18:03
-
-
Save rfde/8371934 to your computer and use it in GitHub Desktop.
Fährt den Rechner herunter, wenn kein Nutzer mehr auf den Samba-Server zugreift und einige andere Kriterien zutreffen (s. Kommentar im Code).Eintrag in der Crontab oder Einrichtung in runwhen nicht vergessen (bei mir wird das Script alle 20 Minuten ausgeführt)! Als root laufen lassen! Pfade ggf. anpassen! Achte auf den Benutzer smb-public!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Dateiname: | |
# autoshutdown.sh | |
# Lizenz: | |
# MIT-Lizenz (http://opensource.org/licenses/MIT) | |
# Beschreibung: | |
# Faehrt den Rechner herunter, wenn nach 2 Durchlaeufen des Skripts (optimalerweise alle ~20 Minuten | |
# via cron/runwhen/whatever ausgefuehrt) folgende Bedingungen erfuellt sind: | |
# * Es existiert keine Datei "stop.txt" (Inhalt egal) im Root-Verzeichnis der Public-Freigabe | |
# des Samba-Servers (ermoeglicht es den Usern, einen System-Shutdown einfach zu blockieren) | |
# * Niemand benutzt den Samba-Server | |
# * Gewisse Prozesse (wget, rsync, mplayer, ...) laufen nicht | |
# * Niemand ist via SSH (oder direkt auf der Konsole) eingeloggt | |
# * Es ist keine Screen-Session offen | |
# * Pings an die unten genannten Hosts schlagen fehl | |
# Beispiel-Eintrag fuer cron (/etc/crontab) [Ausfuehrung alle 20 Minuten als root] | |
# */20 * * * * root /usr/local/sbin/autoshutdown.sh > /dev/null 2>&1 | |
checkIfUserStopFileExists () { | |
if [ `ls -la /home/smb-public/share/stop.txt | wc -l` == "0" ]; then | |
# Kein StopFile | |
return 0 | |
else | |
# StopFile existiert | |
logger "autoshutdown: Stopfile existiert; System wird nicht heruntergefahren." | |
return 1 | |
fi | |
} | |
checkSamba () { | |
if [ `/usr/bin/smbstatus | grep -iE "$(pidof smbd | sed -e 's/ /|/g')" | wc -l` != "0" ]; then | |
# Es sind noch User da | |
logger "autoshutdown: Samba wird verwendet; System wird nicht heruntergefahren." | |
return 1 | |
else | |
# Kein User eingeloggt | |
return 0 | |
fi | |
} | |
checkAnyProcess () { | |
pidof $1 > /dev/null | |
if [ $? -eq 0 ]; then | |
# laeuft | |
logger "autoshutdown: $1 wird verwendet; System wird nicht heruntergefahren." | |
return 1 | |
else | |
# laeuft nicht | |
return 0 | |
fi | |
} | |
checkSshConnections () { | |
if [ `w -hs | wc -l` == "0" ]; then | |
# Keine SSH-Verbindungen | |
return 0 | |
else | |
# Es bestehen SSH-Verbindungen | |
logger "autoshutdown: Es sind noch User auf der Konsole/via SSH eingeloggt; System wird nicht heruntergefahren." | |
return 1 | |
fi | |
} | |
checkHostsViaPing () { | |
declare -a checkHosts=('192.168.178.220' '192.168.178.46' '192.168.178.210' '192.168.178.211'); | |
for h in "${checkHosts[@]}"; do | |
ping -q -c2 $h > /dev/null | |
if [ $? -eq 0 ]; then | |
# PC ist online | |
logger "autoshutdown: [ping] $h ist online; System wird nicht heruntergefahren" | |
return 1 | |
fi | |
done | |
return 0 | |
} | |
checkNoticeStopFile () { | |
if [ `ls -la /home/smb-public/share/stop-um-*.txt | wc -l` == "0" ]; then | |
# Bisher keine Ankuendigung erfolgt | |
return 1 | |
else | |
# Wurde angekuendigt | |
return 0 | |
fi | |
} | |
exitAndCreateNoticeStopFile () { | |
logger "autoshutdown: System-Halt wird vorgemerkt." | |
FILENAME=/home/smb-public/share/stop-um-$(date --date="20 minutes" +"%H")-$(date --date="20 minutes" +"%M")-$(date --date="20 minutes" +"%S").txt | |
touch $FILENAME | |
chown smb-public $FILENAME | |
exit | |
} | |
deleteNoticeStopFile () { | |
logger "autoshutdown: Vormerkung des System-Halt wird verworfen." | |
rm -f /home/smb-public/share/stop-um-*.txt | |
} | |
shutdownNow() { | |
logger "autoshutdown: System wird heruntergefahren." | |
rm -f /home/smb-public/share/stop-um-*.txt | |
# Herunterfahren: | |
#shutdown -hP now | |
# Standby (Debian: Paket "pm-utils" installieren!): | |
pm-suspend | |
} | |
exitWithoutShutdown() { | |
rm -f /home/smb-public/share/stop-um-*.txt | |
exit | |
} | |
checkIfUserStopFileExists | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkSamba | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkAnyProcess wget | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkAnyProcess rsync | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkAnyProcess mplayer | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkAnyProcess SCREEN | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkSshConnections | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkHostsViaPing | |
if [ $? -eq 1 ]; then exitWithoutShutdown; fi | |
checkNoticeStopFile | |
if [ $? -eq 1 ]; then exitAndCreateNoticeStopFile; fi | |
shutdownNow |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment