Home | History | Annotate | Download | only in common_lib
      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 
      8 import logging
      9 import os
     10 import re
     11 
     12 import common
     13 from autotest_lib.client.cros import constants
     14 
     15 
     16 JETSTREAM_BOARDS = frozenset(['arkham', 'gale', 'whirlwind'])
     17 
     18 
     19 def _lsbrelease_search(regex, group_id=0, lsb_release_content=None):
     20     """Searches /etc/lsb-release for a regex match.
     21 
     22     @param regex: Regex to match.
     23     @param group_id: The group in the regex we are searching for.
     24                      Default is group 0.
     25     @param lsb_release_content: A string represents the content of lsb-release.
     26             If the caller is from drone, it can pass in the file content here.
     27 
     28     @returns the string in the specified group if there is a match or None if
     29              not found.
     30 
     31     @raises IOError if /etc/lsb-release can not be accessed.
     32     """
     33     if lsb_release_content is None:
     34         with open(constants.LSB_RELEASE) as lsb_release_file:
     35             lsb_release_content = lsb_release_file.read()
     36     for line in lsb_release_content.split('\n'):
     37         m = re.match(regex, line)
     38         if m:
     39             return m.group(group_id)
     40     return None
     41 
     42 
     43 def get_current_board(lsb_release_content=None):
     44     """Return the current board name.
     45 
     46     @param lsb_release_content: A string represents the content of lsb-release.
     47             If the caller is from drone, it can pass in the file content here.
     48 
     49     @return current board name, e.g "lumpy", None on fail.
     50     """
     51     return _lsbrelease_search(r'^CHROMEOS_RELEASE_BOARD=(.+)$', group_id=1,
     52                               lsb_release_content=lsb_release_content)
     53 
     54 
     55 def get_chromeos_release_version(lsb_release_content=None):
     56     """Get chromeos version in device under test as string. None on fail.
     57 
     58     @param lsb_release_content: A string represents the content of lsb-release.
     59             If the caller is from drone, it can pass in the file content here.
     60 
     61     @return chromeos version in device under test as string. None on fail.
     62     """
     63     return _lsbrelease_search(r'^CHROMEOS_RELEASE_VERSION=(.+)$', group_id=1,
     64                               lsb_release_content=lsb_release_content)
     65 
     66 
     67 def get_chromeos_release_milestone(lsb_release_content=None):
     68     """Get chromeos milestone 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 release milestone in device under test as string.
     74             None on fail.
     75     """
     76     return _lsbrelease_search(r'^CHROMEOS_RELEASE_CHROME_MILESTONE=(.+)$',
     77                               group_id=1,
     78                               lsb_release_content=lsb_release_content)
     79 
     80 
     81 def is_moblab(lsb_release_content=None):
     82     """Return if we are running on a Moblab system or not.
     83 
     84     @param lsb_release_content: A string represents the content of lsb-release.
     85             If the caller is from drone, it can pass in the file content here.
     86 
     87     @return the board string if this is a Moblab device or None if it is not.
     88     """
     89     if lsb_release_content is not None:
     90         return _lsbrelease_search(r'.*moblab',
     91                                   lsb_release_content=lsb_release_content)
     92 
     93     if os.path.exists(constants.LSB_RELEASE):
     94         return _lsbrelease_search(r'.*moblab')
     95 
     96     try:
     97         from chromite.lib import cros_build_lib
     98         if cros_build_lib.IsInsideChroot():
     99             return None
    100     except ImportError as e:
    101         logging.error('Unable to determine if this is a moblab system: %s', e)
    102 
    103 
    104 def is_jetstream(lsb_release_content=None):
    105     """Parses lsb_contents to determine if the host is a Jetstream host.
    106 
    107     @param lsb_release_content: The string contents of lsb-release.
    108             If None, the local lsb-release is used.
    109 
    110     @return True if the host is a Jetstream device, otherwise False.
    111     """
    112     board = get_current_board(lsb_release_content=lsb_release_content)
    113     return board in JETSTREAM_BOARDS
    114 
    115 
    116 def get_chrome_milestone(lsb_release_content=None):
    117     """Get the value for the Chrome milestone.
    118 
    119     @param lsb_release_content: A string represents the content of lsb-release.
    120             If the caller is from drone, it can pass in the file content here.
    121 
    122     @return the value for the Chrome milestone
    123     """
    124     return _lsbrelease_search(r'^CHROMEOS_RELEASE_CHROME_MILESTONE=(.+)$',
    125                               group_id=1,
    126                               lsb_release_content=lsb_release_content)
    127 
    128 
    129 def get_device_type(lsb_release_content=None):
    130     """Get the device type string, e.g. "CHROMEBOOK" or "CHROMEBOX".
    131 
    132     @param lsb_release_content: A string represents the content of lsb-release.
    133             If the caller is from drone, it can pass in the file content here.
    134 
    135     @return the DEVICETYPE value for this machine.
    136     """
    137     return _lsbrelease_search(r'^DEVICETYPE=(.+)$', group_id=1,
    138                               lsb_release_content=lsb_release_content)
    139 
    140 
    141 def is_arc_available(lsb_release_content=None):
    142     """Returns True if the device has ARC installed.
    143 
    144     @param lsb_release_content: A string represents the content of lsb-release.
    145             If the caller is from drone, it can pass in the file content here.
    146 
    147     @return True if the device has ARC installed.
    148     """
    149     return (_lsbrelease_search(r'^CHROMEOS_ARC_VERSION',
    150                                lsb_release_content=lsb_release_content)
    151             is not None)
    152