Home | History | Annotate | Download | only in platform_Powerwash
      1 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 from autotest_lib.client.common_lib import error
      6 from autotest_lib.server import test
      7 
      8 import logging
      9 
     10 
     11 POWERWASH_COUNT = '/mnt/stateful_partition/unencrypted/preserve/powerwash_count'
     12 
     13 POWERWASH_MARKER_FILE = '/mnt/stateful_partition/factory_install_reset'
     14 
     15 POWERWASH_COMMAND = 'safe fast keepimg'
     16 
     17 STATEFUL_MARKER_FILE = '/mnt/stateful_partition/platform_Powerwash_flag'
     18 
     19 # Log files to help debugging what happened during last clobbering (powerwash).
     20 CLOBBER_STATE_LOG_FILE = '/mnt/stateful_partition/unencrypted/clobber-state.log'
     21 CLOBBER_LOG_FILE = '/mnt/stateful_partition/unencrypted/clobber.log'
     22 
     23 
     24 class platform_Powerwash(test.test):
     25     """Powerwash a device."""
     26     version = 1
     27 
     28     def run_once(self, host):
     29         self._host = host
     30 
     31         count_before = self._powerwash_count()
     32 
     33         # We create a file on the stateful partition to test if it is deleted
     34         # during the powerwash.
     35         self._host.run('echo car > %s' % STATEFUL_MARKER_FILE)
     36 
     37         logging.debug('Signaling powerwash on the device.')
     38         self._mark_powerwash()
     39         self._host.reboot()
     40 
     41         # Check if the marker file still exists on the stateful partition.
     42         # The powerwash cycle should remove it.
     43         marker = self._host.run('[ -e %s ]' % STATEFUL_MARKER_FILE,
     44                                 ignore_status=True, ignore_timeout=True)
     45 
     46         # If "[ -e file ]" finishes with status 0, the file is present.
     47         if marker is None or marker.exit_status == 0:
     48             raise error.TestFail("Powerwash cycle didn't remove the marker "
     49                                  "file on the stateful partition.")
     50 
     51         # Capture powerwash logs.
     52         logging.debug('Powerwash logs: %r', self._host.run(
     53                 'cat %s %s 2>/dev/null' % (CLOBBER_LOG_FILE,
     54                                            CLOBBER_STATE_LOG_FILE),
     55                 ignore_status=True).stdout.strip())
     56 
     57         # Check the powerwash counter before and after the powerwash to verify
     58         # it was incremented. This file should be preserved by the powerwash.
     59         count_after = self._powerwash_count()
     60         if count_after != count_before + 1:
     61             raise error.TestFail("Powerwash count didn't increase after "
     62                                  "powerwash cycle.")
     63 
     64 
     65     def _mark_powerwash(self, command=None):
     66         """Creates the Powerwash marker file on the host with the given command.
     67 
     68         @param command: The text to include on the marker file, *not* including
     69                         the '\n' at the end.
     70         """
     71         if command is None:
     72             command = POWERWASH_COMMAND
     73         self._host.run("echo '%s' > %s" % (command, POWERWASH_MARKER_FILE))
     74 
     75 
     76     def _powerwash_count(self):
     77         """Return the powerwash count from the DUT."""
     78         count = self._host.run('test -e %s && cat %s || true' %
     79                                (POWERWASH_COUNT,
     80                                 POWERWASH_COUNT)).stdout.strip()
     81         logging.debug('Powerwash count is: %r', count)
     82         if count:
     83             return int(count)
     84         return 0
     85