Skip to content

Instantly share code, notes, and snippets.

@rfde
Last active August 23, 2017 18:03
Show Gist options
  • Save rfde/8371934 to your computer and use it in GitHub Desktop.
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!
#!/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