• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2018 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
5import logging
6import re
7
8from autotest_lib.client.common_lib import error
9
10
11def make_rootfs_writable(host):
12    """
13    Checks and makes root filesystem writable.
14
15    Checks if root filesytem is writable. If not
16    it converts root filesystem to writable.
17    This function will reboot the DUT
18
19    @param host: An Autotest host object
20
21    @raises TestError: If making root fs  writable fails.
22
23    """
24
25    if  is_rootfs_writable(host):
26        logging.info('DUT root file system is writable.')
27    else:
28        logging.info('DUT root file system is not writable. '
29                     'Converting it writable...')
30        convert_rootfs_writable(host)
31        if not is_rootfs_writable(host):
32            raise error.TestError('Failed to make root filesystem writable')
33        logging.info('DUT root filesystem converted to writable')
34
35
36def convert_rootfs_writable(host):
37    """
38    Makes CrOS rootfs writable.
39
40    Remove root fs verification, reboot host
41    and remounts the root fs
42
43    @param host: An Autotest host object.
44
45    @raises TestError: If executing the command on CrOS fails.
46    """
47
48    logging.info('Disabling rootfs verification.')
49    remove_rootfs_verification(host)
50
51    logging.info('Rebooting the host')
52    host.reboot()
53
54    logging.info('Remounting root filesystem')
55    cmd = 'mount -o remount,rw /'
56    res = host.run(cmd)
57
58    if res.exit_status != 0:
59        raise error.TestError('Executing remount command on DUT failed')
60
61
62def remove_rootfs_verification(host):
63    """
64    Removes root fs verification from CrOS host.
65
66    @param host: an Autotest host object.
67
68    @raises TestError: if executing the command on CrOS fails.
69    """
70
71    # 2 & 4 are default partitions, and the system boots from one of them.
72    # Code from chromite/scripts/deploy_chrome.py
73    KERNEL_A_PARTITION = 2
74    KERNEL_B_PARTITION = 4
75
76    cmd_template = ('/usr/share/vboot/bin/make_dev_ssd.sh'
77                    ' --partitions "%d %d"'
78                    ' --remove_rootfs_verification --force')
79    cmd = cmd_template % (KERNEL_A_PARTITION, KERNEL_B_PARTITION)
80    res = host.run(cmd)
81    if res.exit_status != 0:
82        raise error.TestError('Executing command on DUT failed')
83
84
85def is_rootfs_writable(host):
86    """
87    Checks if the root file system is writable.
88
89    @param host: an Autotest host object.
90
91    @returns Boolean denoting where root filesytem is writable or not.
92
93    @raises TestError: if executing the command on CrOS fails.
94    """
95
96    # Query the DUT's filesystem /dev/root and check whether it is rw
97
98    cmd = 'cat /proc/mounts | grep "/dev/root"'
99    result = host.run(cmd)
100    if result.exit_status > 0:
101        raise error.TestError('Executing command on DUT failed')
102    fields = re.split(' |,', result.stdout)
103
104    # Result of grep will be of the following format
105    # /dev/root / ext2 ro,seclabel <....truncated...> => readonly
106    # /dev/root / ext2 rw,seclabel <....truncated...> => readwrite
107    if fields.__len__() < 4 or fields[3] not in ['rw', 'ro']:
108        raise error.TestError('Command output not in expected format')
109
110    return fields[3] == 'rw'
111