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:
Scott Moser 2014-09-12 13:03:44 -04:00
parent aab95dba00
commit c07f9c5bc3
3 changed files with 93 additions and 4 deletions

View 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

View File

@ -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

View File

@ -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