| # Copyright (c) 2018 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 |
| import re |
| |
| from autotest_lib.client.common_lib import error |
| |
| |
| def make_rootfs_writable(host): |
| """ |
| Checks and makes root filesystem writable. |
| |
| Checks if root filesytem is writable. If not |
| it converts root filesystem to writable. |
| This function will reboot the DUT |
| |
| @param host: An Autotest host object |
| |
| @raises TestError: If making root fs writable fails. |
| |
| """ |
| |
| if is_rootfs_writable(host): |
| logging.info('DUT root file system is writable.') |
| else: |
| logging.info('DUT root file system is not writable. ' |
| 'Converting it writable...') |
| convert_rootfs_writable(host) |
| if not is_rootfs_writable(host): |
| raise error.TestError('Failed to make root filesystem writable') |
| logging.info('DUT root filesystem converted to writable') |
| |
| |
| def convert_rootfs_writable(host): |
| """ |
| Makes CrOS rootfs writable. |
| |
| Remove root fs verification, reboot host |
| and remounts the root fs |
| |
| @param host: An Autotest host object. |
| |
| @raises TestError: If executing the command on CrOS fails. |
| """ |
| |
| logging.info('Disabling rootfs verification.') |
| remove_rootfs_verification(host) |
| |
| logging.info('Rebooting the host') |
| host.reboot() |
| |
| logging.info('Remounting root filesystem') |
| cmd = 'mount -o remount,rw /' |
| res = host.run(cmd) |
| |
| if res.exit_status != 0: |
| raise error.TestError('Executing remount command on DUT failed') |
| |
| |
| def remove_rootfs_verification(host): |
| """ |
| Removes root fs verification from CrOS host. |
| |
| @param host: an Autotest host object. |
| |
| @raises TestError: if executing the command on CrOS fails. |
| """ |
| |
| # 2 & 4 are default partitions, and the system boots from one of them. |
| # Code from chromite/scripts/deploy_chrome.py |
| KERNEL_A_PARTITION = 2 |
| KERNEL_B_PARTITION = 4 |
| |
| cmd_template = ('/usr/share/vboot/bin/make_dev_ssd.sh' |
| ' --partitions "%d %d"' |
| ' --remove_rootfs_verification --force') |
| cmd = cmd_template % (KERNEL_A_PARTITION, KERNEL_B_PARTITION) |
| res = host.run(cmd) |
| if res.exit_status != 0: |
| raise error.TestError('Executing command on DUT failed') |
| |
| |
| def is_rootfs_writable(host): |
| """ |
| Checks if the root file system is writable. |
| |
| @param host: an Autotest host object. |
| |
| @returns Boolean denoting where root filesytem is writable or not. |
| |
| @raises TestError: if executing the command on CrOS fails. |
| """ |
| |
| # Query the DUT's filesystem /dev/root and check whether it is rw |
| |
| cmd = 'cat /proc/mounts | grep "/dev/root"' |
| result = host.run(cmd) |
| if result.exit_status > 0: |
| raise error.TestError('Executing command on DUT failed') |
| fields = re.split(' |,', result.stdout) |
| |
| # Result of grep will be of the following format |
| # /dev/root / ext2 ro,seclabel <....truncated...> => readonly |
| # /dev/root / ext2 rw,seclabel <....truncated...> => readwrite |
| if fields.__len__() < 4 or fields[3] not in ['rw', 'ro']: |
| raise error.TestError('Command output not in expected format') |
| |
| return fields[3] == 'rw' |