summaryrefslogtreecommitdiff
path: root/etc/functions/off
blob: 12997f4c3087cccfbd025a9adcb911e981e34463 (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
## vim:ft=zsh
## Small shutdown/reboot wrapper to work together with my other tools
## Usage: off [-nrh] [place]
## Copyright (C) 2008, 2009 by Daniel Friesel <derf@derf.homelinux.org>
## License: WTFPL <http://sam.zoy.org/wtfpl>

autoload warn fdie
typeset filesystem garbage file
typeset -a filesystems
typeset tune2fs
typeset -i force reboot simulate exit_ok=1
typeset gone

function execute {
	if (( simulate )) {
		echo $*
	} else {
		$* || exit_ok=0
	}
}

while [[ $1 == -* ]] {
	case $1 in
		-n) simulate=1 ;;
		-r) reboot=1 ;;
		--force) force=1 ;;
		-h)
			print 'off - shutdown / restart the system'
			print 'Usage: off [--force] [-hnr] [place]'
			print 'Options:\n'
			print '  -n    simulate. Do not actually shutdown'
			print '  -r    reboot'
			print '  -h    show this message'
			print '\--force shutdown even if the machine is a server'
			print ''
			print ' place  supply if machine will remain off for some time,'
			print '        either "gone" or the place one will be going to'
			return 0
		;;
		-|--) shift; break ;;
		*) fdie "Unrecognized option: $1"; return 1 ;;
	esac
	shift
}

gone=$1

# Don't shut down a server too easily
if [[ $force != 1 && $hosts[$HOST] == *:server:* ]] {
	warn "This seems to be a server... not shutting down"
	echo "Use 'off --force' if you really mean it"
	return 1
}

if [[ -n $gone ]] {
	for file in ~/packages/leave.d/etc/{_any,$gone}/*(N); {
		if [[ ${file:e} == zsh ]] {
			execute source $file
		} else {
			execute $file
		}
	}
}

if pgrep -x amarokapp &> /dev/null; then
	execute dcop amarok MainApplication-Interface quit
fi

execute uinit -o text stop-all

while read filesystem garbage; do
	if [[ $garbage == *[12] ]] && fgrep -q $filesystem /etc/mtab; then
		filesystems+=$filesystem
	fi
done < /etc/fstab

for filesystem in $filesystems; {
	tune2fs=($(sudo tune2fs -l $filesystem | fgrep -i 'mount count' | grep -o '[0-9]*'))
	if (( tune2fs[2] - tune2fs[1] < 5 )) {
		exit_ok=0
		echo "notice: filesystem $filesystem due to check in $((tune2fs[2] - tune2fs[1])) mounts"
	}
}
if (( reboot )) {
	execute sudo reboot
} else {
	execute sudo halt
}
if (( exit_ok )) {
	execute exit
}