blob: c8e9bfad1b744cbee0e72a6e5f234315c62b40b8 (
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
|
#!/bin/sh /etc/rc.common
EXTRA_COMMANDS="apply commit"
START=99
_unregister_script() {
/etc/init.d/config_generation disable
rm /etc/init.d/config_generation
}
_rollback() {
rm -rf /overlay/upper.dead
mv /overlay/upper /overlay/upper.dead
# this should never fail, unless something *else* is also mucking
# with overlayfs state.
if mv -T /overlay/upper.prev /overlay/upper; then
rm -rf /overlay/upper.dead
else
echo "rollback failed, check /overlay/upper.dead and recover!" >&2
exit 1
fi
}
apply() {
if ! rm -rf /overlay/upper.prev/ \
|| ! cp -al /overlay/upper/ /overlay/upper.prev/ \
|| ! rm -rf /overlay/upper.prev/etc/ \
|| ! cp -a /overlay/upper/etc/ /overlay/upper.prev/
then
echo "failed to snapshot old config"
rm -rf /overlay/upper.prev
exit 1
fi
if ! /etc/init.d/config_generation enable
then
echo "failed to schedule rollback"
rm -rf /overlay/upper.prev
exit 1
fi
# everything after this point may fail. if it does we'll simply roll back
# immediately and reboot.
trap 'reboot &' EXIT
log() {
printf "$LOG_FMT\n" "$*"
}
if ! (
set -e
@deploy_steps@
)
then
_rollback
fi
}
commit() {
if ! [ -e /overlay/upper.prev ]; then
exit 1
fi
touch /tmp/.abort-rollback
}
start() {
[ -d /overlay/upper.prev ] || {
_unregister_script
exit 0
}
local needs_rollback=true
local timeout=@rollback_timeout@
while [ $timeout -gt 0 ]; do
timeout=$(( timeout - 1 ))
[ -e /tmp/.abort-rollback ] && {
needs_rollback=false
rm /tmp/.abort-rollback
break
}
sleep 1
done
if $needs_rollback; then
_rollback
_unregister_script
reboot
else
rm -rf /overlay/upper.prev
_unregister_script
fi
}
|