quick-provision: Share keyvals from quick provision script to devserver.

BUG=chromium:779870
TEST=curl "http://${ds}/stage?archive_url=gs://chromeos-image-archive/${buil d}&artifacts=quick_provision,stateful"; curl "http://${ds}/cros_au?full_update=False&force_update=True&build_name=${build}&host_name=${dut}&async=False&clobber_stateful=True&quick_provision=True"

Change-Id: Icd41138bc12854d611c7032313332de70021a933
Reviewed-on: https://chromium-review.googlesource.com/804960
Commit-Ready: David Riley <davidriley@chromium.org>
Tested-by: David Riley <davidriley@chromium.org>
Reviewed-by: Xixuan Wu <xixuan@chromium.org>
diff --git a/cros_update.py b/cros_update.py
index 6f91965..90e271b 100644
--- a/cros_update.py
+++ b/cros_update.py
@@ -28,6 +28,7 @@
 import cros_update_progress
 import logging # pylint: disable=cros-logging-import
 import os
+import re
 import sys
 import time
 import traceback
@@ -219,7 +220,12 @@
     """Performs a quick provision of device.
 
     Returns:
-      A CommandResult of the invocation.
+      A dictionary of extracted key-value pairs returned from the script
+      execution.
+
+    Raises:
+      cros_build_lib.RunCommandError: error executing command or script
+      remote_access.SSHConnectionError: SSH connection error
     """
     pid = os.getpid()
     pgid = os.getpgid(pid)
@@ -235,7 +241,12 @@
                dut_script, cros_build_lib.ShellQuote(status_url),
                self.build_name, self.static_url
            )
-    return device.RunCommand(cmd, log_output=True)
+    results = device.RunCommand(cmd, log_output=True, capture_output=True)
+    key_re = re.compile(r'^KEYVAL: ([^\d\W]\w*)=(.*)$')
+    matches = [key_re.match(l) for l in results.output.splitlines()]
+    keyvals = {m.group(1): m.group(2) for m in matches if m}
+    logging.debug("DUT returned keyvals: %s" % keyvals)
+    return keyvals
 
   def TriggerAU(self):
     """Execute auto update for cros_host.