1# Copyright 2015 The Chromium 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# This module provides helper method to parse /etc/lsb-release file to extract 6# various information. 7 8import logging 9import os 10import re 11 12import common 13from autotest_lib.client.cros import constants 14 15 16JETSTREAM_BOARDS = frozenset(['arkham', 'gale', 'mistral', 'whirlwind']) 17 18def _lsbrelease_search(regex, group_id=0, lsb_release_content=None): 19 """Searches /etc/lsb-release for a regex match. 20 21 @param regex: Regex to match. 22 @param group_id: The group in the regex we are searching for. 23 Default is group 0. 24 @param lsb_release_content: A string represents the content of lsb-release. 25 If the caller is from drone, it can pass in the file content here. 26 27 @returns the string in the specified group if there is a match or None if 28 not found. 29 30 @raises IOError if /etc/lsb-release can not be accessed. 31 """ 32 if lsb_release_content is None: 33 with open(constants.LSB_RELEASE) as lsb_release_file: 34 lsb_release_content = lsb_release_file.read() 35 for line in lsb_release_content.split('\n'): 36 m = re.match(regex, line) 37 if m: 38 return m.group(group_id) 39 return None 40 41 42def get_current_board(lsb_release_content=None): 43 """Return the current board name. 44 45 @param lsb_release_content: A string represents the content of lsb-release. 46 If the caller is from drone, it can pass in the file content here. 47 48 @return current board name, e.g "lumpy", None on fail. 49 """ 50 return _lsbrelease_search(r'^CHROMEOS_RELEASE_BOARD=(.+)$', group_id=1, 51 lsb_release_content=lsb_release_content) 52 53 54def get_chromeos_channel(lsb_release_content=None): 55 """Get chromeos channel in device under test as string. None on fail. 56 57 @param lsb_release_content: A string represents the content of lsb-release. 58 If the caller is from drone, it can pass in the file content here. 59 60 @return chromeos channel in device under test as string. None on fail. 61 """ 62 return _lsbrelease_search( 63 r'^CHROMEOS_RELEASE_DESCRIPTION=.+ (.+)-channel.*$', 64 group_id=1, lsb_release_content=lsb_release_content) 65 66 67def get_chromeos_release_version(lsb_release_content=None): 68 """Get chromeos version in device under test as string. None on fail. 69 70 @param lsb_release_content: A string represents the content of lsb-release. 71 If the caller is from drone, it can pass in the file content here. 72 73 @return chromeos version in device under test as string. None on fail. 74 """ 75 return _lsbrelease_search(r'^CHROMEOS_RELEASE_VERSION=(.+)$', group_id=1, 76 lsb_release_content=lsb_release_content) 77 78 79def get_chromeos_release_builder_path(lsb_release_content=None): 80 """Get chromeos builder path from device under test as string. 81 82 @param lsb_release_content: A string representing the content of 83 lsb-release. If the caller is from drone, it can pass in the file 84 content here. 85 86 @return chromeos builder path in device under test as string. None on fail. 87 """ 88 return _lsbrelease_search(r'^CHROMEOS_RELEASE_BUILDER_PATH=(.+)$', 89 group_id=1, 90 lsb_release_content=lsb_release_content) 91 92 93def get_chromeos_release_milestone(lsb_release_content=None): 94 """Get chromeos milestone in device under test as string. None on fail. 95 96 @param lsb_release_content: A string represents the content of lsb-release. 97 If the caller is from drone, it can pass in the file content here. 98 99 @return chromeos release milestone in device under test as string. 100 None on fail. 101 """ 102 return _lsbrelease_search(r'^CHROMEOS_RELEASE_CHROME_MILESTONE=(.+)$', 103 group_id=1, 104 lsb_release_content=lsb_release_content) 105 106 107def is_moblab(lsb_release_content=None): 108 """Return if we are running on a Moblab system or not. 109 110 @param lsb_release_content: A string represents the content of lsb-release. 111 If the caller is from drone, it can pass in the file content here. 112 113 @return the board string if this is a Moblab device or None if it is not. 114 """ 115 if lsb_release_content is not None: 116 return _lsbrelease_search(r'.*moblab', 117 lsb_release_content=lsb_release_content) 118 119 if os.path.exists(constants.LSB_RELEASE): 120 return _lsbrelease_search(r'.*moblab') 121 122 try: 123 from chromite.lib import cros_build_lib 124 if cros_build_lib.IsInsideChroot(): 125 return None 126 except ImportError as e: 127 logging.error('Unable to determine if this is a moblab system: %s', e) 128 129 130def is_jetstream(lsb_release_content=None): 131 """Parses lsb_contents to determine if the host is a Jetstream host. 132 133 @param lsb_release_content: The string contents of lsb-release. 134 If None, the local lsb-release is used. 135 136 @return True if the host is a Jetstream device, otherwise False. 137 """ 138 board = get_current_board(lsb_release_content=lsb_release_content) 139 return board in JETSTREAM_BOARDS 140 141def is_gce_board(lsb_release_content=None): 142 """Parses lsb_contents to determine if host is a GCE board. 143 144 @param lsb_release_content: The string contents of lsb-release. 145 If None, the local lsb-release is used. 146 147 @return True if the host is a GCE board otherwise False. 148 """ 149 return is_lakitu(lsb_release_content=lsb_release_content) 150 151def is_lakitu(lsb_release_content=None): 152 """Parses lsb_contents to determine if host is lakitu. 153 154 @param lsb_release_content: The string contents of lsb-release. 155 If None, the local lsb-release is used. 156 157 @return True if the host is lakitu otherwise False. 158 """ 159 board = get_current_board(lsb_release_content=lsb_release_content) 160 if board is not None: 161 return board.startswith('lakitu') 162 return False 163 164def get_chrome_milestone(lsb_release_content=None): 165 """Get the value for the Chrome milestone. 166 167 @param lsb_release_content: A string represents the content of lsb-release. 168 If the caller is from drone, it can pass in the file content here. 169 170 @return the value for the Chrome milestone 171 """ 172 return _lsbrelease_search(r'^CHROMEOS_RELEASE_CHROME_MILESTONE=(.+)$', 173 group_id=1, 174 lsb_release_content=lsb_release_content) 175 176 177def get_device_type(lsb_release_content=None): 178 """Get the device type string, e.g. "CHROMEBOOK" or "CHROMEBOX". 179 180 @param lsb_release_content: A string represents the content of lsb-release. 181 If the caller is from drone, it can pass in the file content here. 182 183 @return the DEVICETYPE value for this machine. 184 """ 185 return _lsbrelease_search(r'^DEVICETYPE=(.+)$', group_id=1, 186 lsb_release_content=lsb_release_content) 187 188 189def is_arc_available(lsb_release_content=None): 190 """Returns True if the device has ARC installed. 191 192 @param lsb_release_content: A string represents the content of lsb-release. 193 If the caller is from drone, it can pass in the file content here. 194 195 @return True if the device has ARC installed. 196 """ 197 return (_lsbrelease_search(r'^CHROMEOS_ARC_VERSION', 198 lsb_release_content=lsb_release_content) 199 is not None) 200