Defjam121
8/23/2017 - 6:03 PM

Fährt den Rechner herunter, wenn kein Nutzer mehr auf den Samba-Server zugreift und einige andere Kriterien zutreffen (s. Kommentar im Code)

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