# Copyright (c) 2010 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import logging, os, time from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import error PROCESS_WHITELIST = ( # TODO(dalecurtis): Remove once http://crosbug.com/15697 is fixed. 'cryptohom', 'chapsd', ) SHUTDOWN_CRYPTOHOME_UMOUNT_FAIL = '/var/log/shutdown_cryptohome_umount_failure' SHUTDOWN_STATEFUL_UMOUNT_FAIL = '/var/log/shutdown_stateful_umount_failure' SHUTDOWN_KILLED_PROCESSES_LOG = '/var/log/shutdown_force_kill_processes' class platform_CleanShutdown(test.test): version = 1 def _log_remove_if_exists(self, filename, message): if not os.path.exists(filename): return contents = utils.read_file(filename).strip() os.remove(filename) if filename == SHUTDOWN_KILLED_PROCESSES_LOG: # Remove all killed processes listed in the white list. An example # log is included below: # # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME # cryptohom [........] # filtered_contents = filter( lambda line: not line.startswith(PROCESS_WHITELIST), contents.splitlines()) # If there are no lines left but the header, return nothing. if len(filtered_contents) <= 1: return else: contents = '\n'.join(filtered_contents) logging.error('Last shutdown problem: %s. Detailed output was:\n%s' % (message, contents)) self._errors.append(message) def run_once(self): self._errors = [] # Problems during shutdown are brought out in /var/log files # which we show here. self._log_remove_if_exists(SHUTDOWN_CRYPTOHOME_UMOUNT_FAIL, 'cryptohome unmount failed') self._log_remove_if_exists(SHUTDOWN_STATEFUL_UMOUNT_FAIL, 'stateful unmount failed') self._log_remove_if_exists(SHUTDOWN_KILLED_PROCESSES_LOG, 'force killed processes') if self._errors: raise error.TestFail( 'Last shutdown problems: %s' % ' and '.join(self._errors))