summaryrefslogtreecommitdiff
path: root/meta-phosphor/recipes-phosphor/initrdscripts/files/obmc-shutdown.sh
blob: 9bafcfe217831e0abeba59f38e0c282ee3763d1f (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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/sh

echo shutdown: "$@"

export PS1="shutdown-sh# "
# exec bin/sh

cd /
if [ ! -e /proc/mounts ]
then
	mkdir -p /proc
	mount  proc /proc -tproc
	umount_proc=1
else
	umount_proc=
fi

# Remove an empty oldroot, that means we are not invoked from systemd-shutdown
rmdir /oldroot 2>/dev/null

# Move /oldroot/run to /mnt in case it has the underlying rofs loop mounted.
# Reverse sort order will ensure the overlay is unmounted before the loop mount
mkdir -p /mnt
mount --move /oldroot/run /mnt

# Unmount paths with /oldroot /mnt under / and those ending with ro or rw
# Use . to match any single character because busybox awk doesn't handle [/]
awk '$2 ~ /^.oldroot|^.mnt|.r[ow]$/ { print $2 }' < /proc/mounts | sort -r | while IFS= read -r f
do
	echo "Unmounting $f"
	umount "$f"
done

update=/run/initramfs/update
image=/run/initramfs/image-

wdt="-t 1 -T 5"
wdrst="-T 15"

if ls $image* > /dev/null 2>&1
then
	if test -x $update
	then
		if test -c /dev/watchdog
		then
			echo Pinging watchdog ${wdt+with args $wdt}
			# shellcheck disable=SC2086
			watchdog $wdt -F /dev/watchdog &
			wd=$!
		else
			wd=
		fi
		$update --clean-saved-files
		remaining=$(ls $image*)
		if test -n "$remaining"
		then
			echo 1>&2 "Flash update failed to flash these images:"
			echo 1>&2 "$remaining"
		else
			echo "Flash update completed."
		fi

		if test -n "$wd"
		then
			kill -9 $wd
			if test -n "$wdrst"
			then
				echo "Resetting watchdog timeouts to $wdrst"
				# shellcheck disable=SC2086
				watchdog $wdrst -F /dev/watchdog &
				sleep 1
				# Kill the watchdog daemon, setting a timeout
				# for the remaining shutdown work
				kill -9 $!
			fi
		fi
	else
		echo 1>&2 "Flash update requested but $update program missing!"
	fi
fi

echo Remaining mounts:
cat /proc/mounts

test "$umount_proc" && umount /proc && rmdir /proc

# tcsattr(tty, TIOCDRAIN, mode) to drain tty messages to console
test -t 1 && stty cooked 0<&1

# Execute the command systemd told us to ...
if test -d /oldroot  && test "$1"
then
	if test "$1" = kexec
	then
		$1 -f -e
	else
		$1 -f
	fi
fi


echo "Execute ${1-reboot} -f if all unmounted ok, or exec /init"

export PS1=shutdown-sh#\
exec /bin/sh