upstart: add blocknet which blocks net until after cloud-init-local
This makes it so networking wont start to come up until after cloud-init-local has had a chance to search local datasources and set /etc/network/interfaces. The changes most likely need to still be done for systemd.
This commit is contained in:
parent
aab95dba00
commit
c07f9c5bc3
83
upstart/cloud-init-blocknet.conf
Normal file
83
upstart/cloud-init-blocknet.conf
Normal file
@ -0,0 +1,83 @@
|
||||
# cloud-init-blocknet
|
||||
# the purpose of this job is
|
||||
# * to block networking from coming up until cloud-init-nonet has run
|
||||
# * timeout if they all do not come up in a reasonable amount of time
|
||||
description "block networking until cloud-init-local"
|
||||
start on (starting network-interface
|
||||
or starting network-manager
|
||||
or starting networking)
|
||||
stop on stopped cloud-init-local
|
||||
|
||||
instance $JOB${INTERFACE:+/}${INTERFACE:-}
|
||||
export INTERFACE
|
||||
task
|
||||
|
||||
script
|
||||
set +e # you cannot trap TERM reliably with 'set -e'
|
||||
SLEEP_CHILD=""
|
||||
LOG="/run/${UPSTART_JOB}.log"
|
||||
|
||||
static_network_up() {
|
||||
local emitted="/run/network/static-network-up-emitted"
|
||||
# /run/network/static-network-up-emitted is written by
|
||||
# upstart (via /etc/network/if-up.d/upstart). its presense would
|
||||
# indicate that static-network-up has already fired.
|
||||
[ -e "$emitted" -o -e "/var/$emitted" ]
|
||||
}
|
||||
msg() {
|
||||
local uptime="" idle="" msg=""
|
||||
if [ -r /proc/uptime ]; then
|
||||
read uptime idle < /proc/uptime
|
||||
fi
|
||||
msg="${UPSTART_INSTANCE}${uptime:+[${uptime}]}: $*"
|
||||
echo "$msg" >> "$LOG"
|
||||
echo "$msg"
|
||||
}
|
||||
|
||||
handle_sigterm() {
|
||||
# if we received sigterm and static networking is up then it probably
|
||||
# came from upstart as a result of 'stop on static-network-up'
|
||||
msg "got sigterm"
|
||||
if [ -n "$SLEEP_CHILD" ]; then
|
||||
if ! kill $SLEEP_CHILD 2>/dev/null; then
|
||||
[ ! -d "/proc/$SLEEP_CHILD" ] ||
|
||||
msg "hm.. failed to kill sleep pid $SLEEP_CHILD"
|
||||
fi
|
||||
fi
|
||||
msg "stopped"
|
||||
exit 0
|
||||
}
|
||||
|
||||
dowait() {
|
||||
msg "blocking $1 seconds"
|
||||
# all this 'exec -a' does is get me a nicely named process in 'ps'
|
||||
# ie, 'sleep-block-network-interface.eth1'
|
||||
if [ -x /bin/bash ]; then
|
||||
bash -c 'exec -a sleep-block-$1 sleep $2' -- "$UPSTART_INSTANCE" "$1" &
|
||||
else
|
||||
sleep "$1" &
|
||||
fi
|
||||
SLEEP_CHILD=$!
|
||||
msg "sleepchild=$SLEEP_CHILD"
|
||||
wait $SLEEP_CHILD
|
||||
SLEEP_CHILD=""
|
||||
}
|
||||
|
||||
trap handle_sigterm TERM
|
||||
|
||||
if [ -n "$INTERFACE" -a "${INTERFACE#lo}" != "${INTERFACE}" ]; then
|
||||
msg "ignoring interface ${INTERFACE}";
|
||||
exit 0;
|
||||
fi
|
||||
|
||||
# static_network_up already occurred
|
||||
static_network_up && { msg "static_network_up already"; exit 0; }
|
||||
|
||||
# local-finished cloud-init-local success or failure
|
||||
lfin="/run/cloud-init/local-finished"
|
||||
[ -f "$lfin" ] && { msg "$lfin found"; exit 0; }
|
||||
|
||||
dowait 120
|
||||
msg "gave up waiting for $lfin"
|
||||
exit 1
|
||||
end script
|
@ -6,4 +6,11 @@ task
|
||||
|
||||
console output
|
||||
|
||||
exec /usr/bin/cloud-init init --local
|
||||
script
|
||||
lfin=/run/cloud-init/local-finished
|
||||
ret=0
|
||||
cloud-init init --local || ret=$?
|
||||
[ -r /proc/uptime ] && read up idle < /proc/uptime || up="N/A"
|
||||
echo "$ret up $up" > "$lfin"
|
||||
exit $ret
|
||||
end script
|
||||
|
@ -58,9 +58,8 @@ script
|
||||
# static_network_up already occurred
|
||||
static_network_up && exit 0
|
||||
|
||||
# obj.pkl comes from cloud-init-local (or previous boot and
|
||||
# manual_cache_clean)
|
||||
[ -f /var/lib/cloud/instance/obj.pkl ] && exit 0
|
||||
# local-finished comes from cloud-init-local
|
||||
[ -f /run/cloud-init/local-finished ] && exit 0
|
||||
|
||||
dowait 10
|
||||
dowait 120
|
||||
|
Loading…
x
Reference in New Issue
Block a user