summaryrefslogtreecommitdiffstats
path: root/goodnight.sh
blob: 54731071c12c772f9595fd4f1d9f2e48a56aa75a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/sh

# Dieses Skript versucht so lange den Rechner herunter zu fahren, bis who keine
# User mehr anzeigt, und keine screen Sessions mehr gefunden werden.
# Wenn die Zeit erreicht ist, zu der der Rechner laufen sollte,
# beendet sich das Skript ohne den Rechner herunterzufahren.

# Zeitpunkt ab dem der Rechner an sein sollte:
SHIFTSTART='10'
# Zeitpunkt ab dem der Rechner heruntergefahren werden sollte:
SHIFTEND='20'
# shutdown Befehl
SHUTDOWN='/sbin/shutdown -h now'
# soll goodnight sagen was es tut?
DEBUG="YES"

# shift is considered started when the machine should run
# returns 0 (==true) if the shift has started
shifthasstarted ()
{
	HOUR=$(date "+%k")
	if [ ${HOUR} -lt ${SHIFTEND} -a ${HOUR} -ge ${SHIFTSTART} ]; then
		return 0
	else
		return 1
	fi
}

# returns 0 if somebody is logged in
somebodyisloggedin ()
{
	r1=$(w -h | wc -l)						# local  users
	r2=$(ps ax | grep -e tmux -e SCREEN -e 'sshd:' | grep -v grep | wc -l)	# remote users
	return $(( ! (r1 + r2) ))
}

# only echos parameter if DEBUG is set to "YES"
debug ()
{
	if [ $DEBUG = "YES" ]; then
		echo "$@"
	fi
}

# Warten, bis alle Benutzer ausgeloggt
debug -n "$(date +'[%F %T]') "
debug -n "waiting for all sessions to end "
while   somebodyisloggedin && ! shifthasstarted ; do
	debug -n "."
	sleep 300
done
debug ""

# Wenn es ausserhalb der Arbeitszeit ist herunterfahren.
debug -n "$(date +'[%F %T]') "
debug "Shift starts at ${SHIFTSTART} and ends at ${SHIFTEND}"
debug -n "$(date +'[%F %T]') "
debug -n "Therefore I am "
if shifthasstarted ; then
	debug "cancelling shutdown because it's my shift"
else
	debug "shutting down after an uptime of $(uptime | awk '{print $1}')"
	${SHUTDOWN}
fi
exit 0