summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--upstart/cloud-init-blocknet.conf85
-rw-r--r--upstart/cloud-init-local.conf9
-rw-r--r--upstart/cloud-init-nonet.conf4
3 files changed, 93 insertions, 5 deletions
diff --git a/upstart/cloud-init-blocknet.conf b/upstart/cloud-init-blocknet.conf
new file mode 100644
index 00000000..dd4f1798
--- /dev/null
+++ b/upstart/cloud-init-blocknet.conf
@@ -0,0 +1,85 @@
+# 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"
+ disable="/etc/cloud/no-blocknet"
+ [ -f "$lfin" ] && { msg "$lfin found"; exit 0; }
+ [ -f "$disable" ] && { msg "$disable found"; exit 0; }
+
+ dowait 120
+ msg "gave up waiting for $lfin"
+ exit 1
+end script
diff --git a/upstart/cloud-init-local.conf b/upstart/cloud-init-local.conf
index 713b36d9..5def043d 100644
--- a/upstart/cloud-init-local.conf
+++ b/upstart/cloud-init-local.conf
@@ -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
diff --git a/upstart/cloud-init-nonet.conf b/upstart/cloud-init-nonet.conf
index e8ebee96..38630b39 100644
--- a/upstart/cloud-init-nonet.conf
+++ b/upstart/cloud-init-nonet.conf
@@ -58,10 +58,6 @@ 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
-
dowait 10
dowait 120
msg "gave up waiting for a network device."