faft: Support a customized recovery reboot command

In some devices, the servo rec mode line doesn't work. A work-around is to
support a customized recovery reboot command instead of controlling servo.

This command may be printing some warning messges to tell a tester to press
Power + Esc + F3 manually, or controlling an external keyboard-pressing device
to press this key combination.

BUG=chrome-os-partner:8572,chrome-os-partner:11585
TEST=manual
Create a script for rec reboot command, like:
$ cat /tmp/rec_reboot.sh
echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
echo "@@@@@@@@ PRESS POWER + ESC + F3 @@@@@@@@"
echo "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"

Run the test and manually press Power + Esc + F3 when the messages show:
$ run_remote_tests.sh --remote=$REMOTE_IP --board $BOARD --servo \
      -a "rec_reboot_cmd=/tmp/rec_reboot.sh" firmware_DevMode

Change-Id: I2f18fddcece326ad0809133c646de563c4429df5
Reviewed-on: https://gerrit.chromium.org/gerrit/28903
Reviewed-by: Vic Yang <victoryang@chromium.org>
Commit-Ready: Tom Wai-Hong Tam <waihong@chromium.org>
Tested-by: Tom Wai-Hong Tam <waihong@chromium.org>
diff --git a/server/cros/faftsequence.py b/server/cros/faftsequence.py
index 7251aa7..bfa72a1 100644
--- a/server/cros/faftsequence.py
+++ b/server/cros/faftsequence.py
@@ -72,6 +72,9 @@
             instead of sending key via servo board.
         _customized_enter_key_command: The customized Enter key command instead
             of sending key via servo board.
+        _customized_rec_reboot_command: The customized recovery reboot command
+            instead of sending key combination of Power + Esc + F3 for
+            triggering recovery reboot.
         _install_image_path: The path of Chrome OS test image to be installed.
         _firmware_update: Boolean. True if firmware update needed after
             installing the image.
@@ -199,6 +202,7 @@
 
     _customized_ctrl_d_key_command = None
     _customized_enter_key_command = None
+    _customized_rec_reboot_command = None
     _install_image_path = None
     _firmware_update = False
 
@@ -220,6 +224,10 @@
             self._customized_enter_key_command = args['enter_cmd']
             logging.info('Customized Enter key command: %s' %
                     self._customized_enter_key_command)
+        if 'rec_reboot_cmd' in args:
+            self._customized_rec_reboot_command = args['rec_reboot_cmd']
+            logging.info('Customized recovery reboot command: %s' %
+                    self._customized_rec_reboot_command)
         if 'image' in args:
             self._install_image_path = args['image']
             logging.info('Install Chrome OS test image path: %s' %
@@ -744,10 +752,14 @@
         i.e. switch ON + reboot + switch OFF, and the new keyboard controlled
         recovery mode, i.e. just press Power + Esc + Refresh.
         """
-        self.servo.enable_recovery_mode()
-        self.cold_reboot()
-        time.sleep(self.EC_REBOOT_DELAY)
-        self.servo.disable_recovery_mode()
+        if self._customized_rec_reboot_command:
+            logging.info('running the customized rec reboot command')
+            os.system(self._customized_rec_reboot_command)
+        else:
+            self.servo.enable_recovery_mode()
+            self.cold_reboot()
+            time.sleep(self.EC_REBOOT_DELAY)
+            self.servo.disable_recovery_mode()
 
 
     def enable_dev_mode_and_reboot(self):