meta-google: gbmc-ip-monitor: Add deferred actions

This makes it possible to defer actions for a future time in order to
let networking events settle out before triggering a reconfiguration.

Change-Id: I0b2372ba6b114a6b6548ccac3944af912482d68a
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/meta-google/recipes-google/networking/files/gbmc-ip-monitor.sh b/meta-google/recipes-google/networking/files/gbmc-ip-monitor.sh
index e64c867..9da090f 100755
--- a/meta-google/recipes-google/networking/files/gbmc-ip-monitor.sh
+++ b/meta-google/recipes-google/networking/files/gbmc-ip-monitor.sh
@@ -44,6 +44,17 @@
   echo '[INIT]'
 }
 
+GBMC_IP_MONITOR_DEFER_OUTSTANDING=
+gbmc_ip_monitor_defer_() {
+  sleep 1
+  printf '[DEFER]\n' >&$GBMC_IP_MONITOR_DEFER
+}
+gbmc_ip_monitor_defer() {
+  [ -z "$GBMC_IP_MONITOR_DEFER_OUTSTANDING" ] || return 0
+  gbmc_ip_monitor_defer_ &
+  GBMC_IP_MONITOR_DEFER_OUTSTANDING=1
+}
+
 gbmc_ip_monitor_parse_line() {
   local line="$1"
   if [[ "$line" == '[INIT]'* ]]; then
@@ -98,11 +109,16 @@
     read line || break
     data=($line)
     mac="${data[1]}"
+  elif [[ "$line" == '[DEFER]'* ]]; then
+    GBMC_IP_MONITOR_DEFER_OUTSTANDING=
+    change=defer
   else
     return 2
   fi
 }
 
+return 0 2>/dev/null
+
 cleanup() {
   local st="$?"
   trap - HUP INT QUIT ABRT TERM EXIT
@@ -111,7 +127,10 @@
 }
 trap cleanup HUP INT QUIT ABRT TERM EXIT
 
-return 0 2>/dev/null
+FIFODIR="$(mktemp -d)"
+mkfifo "$FIFODIR"/fifo
+exec {GBMC_IP_MONITOR_DEFER}<>"$FIFODIR"/fifo
+rm -rf "$FIFODIR"
 
 while read line; do
   gbmc_ip_monitor_parse_line "$line" || continue
@@ -119,4 +138,4 @@
   if [ "$change" = 'init' ]; then
     systemd-notify --ready
   fi
-done < <(gbmc_ip_monitor_generate_init; exec ip monitor link addr route label)
+done < <(gbmc_ip_monitor_generate_init; ip monitor link addr route label & cat <&$GBMC_IP_MONITOR_DEFER)